/ Hex Artifact Content
Login

Artifact 02e01ec7907c7d947ab3041fda0e81eaed05db42:


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 32 32 20 32 30 30 37 2f 30 34 2f 32 36  1.422 2007/04/26
02f0: 20 31 34 3a 34 32 3a 33 36 20 64 61 6e 69 65 6c   14:42:36 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 70 50 61 72 73 65 2d  ck+1);.  pParse-
0a30: 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 20 73 71  >aTableLock = sq
0a40: 6c 69 74 65 52 65 61 6c 6c 6f 63 4f 72 46 72 65  liteReallocOrFre
0a50: 65 28 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65  e(pParse->aTable
0a60: 4c 6f 63 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20  Lock, nBytes);. 
0a70: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54 61   if( pParse->aTa
0a80: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a90: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0aa0: 6c 65 4c 6f 63 6b 5b 70 50 61 72 73 65 2d 3e 6e  leLock[pParse->n
0ab0: 54 61 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20  TableLock++];.  
0ac0: 20 20 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a    p->iDb = iDb;.
0ad0: 20 20 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54      p->iTab = iT
0ae0: 61 62 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69  ab;.    p->isWri
0af0: 74 65 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65  teLock = isWrite
0b00: 4c 6f 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61  Lock;.    p->zNa
0b10: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  me = zName;.  }.
0b20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
0b30: 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e   OP_TableLock in
0b40: 73 74 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61  struction for ea
0b50: 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20  ch table locked 
0b60: 62 79 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d  by the.** statem
0b70: 65 6e 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20  ent (configured 
0b80: 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  by calls to sqli
0b90: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e  te3TableLock()).
0ba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0bb0: 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50  codeTableLocks(P
0bc0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
0bd0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a   int i;.  Vdbe *
0be0: 70 56 64 62 65 3b 20 0a 20 20 61 73 73 65 72 74  pVdbe; .  assert
0bf0: 28 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  ( sqlite3ThreadD
0c00: 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75  ataReadOnly()->u
0c10: 73 65 53 68 61 72 65 64 44 61 74 61 20 7c 7c 20  seSharedData || 
0c20: 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f  pParse->nTableLo
0c30: 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ck==0 );..  if( 
0c40: 30 3d 3d 28 70 56 64 62 65 20 3d 20 73 71 6c 69  0==(pVdbe = sqli
0c50: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
0c60: 65 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e)) ){.    retur
0c70: 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  n;.  }..  for(i=
0c80: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61  0; i<pParse->nTa
0c90: 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  bleLock; i++){. 
0ca0: 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 20     TableLock *p 
0cb0: 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c  = &pParse->aTabl
0cc0: 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 6e  eLock[i];.    in
0cd0: 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a 20  t p1 = p->iDb;. 
0ce0: 20 20 20 69 66 28 20 70 2d 3e 69 73 57 72 69 74     if( p->isWrit
0cf0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 70  eLock ){.      p
0d00: 31 20 3d 20 2d 31 2a 28 70 31 2b 31 29 3b 0a 20  1 = -1*(p1+1);. 
0d10: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
0d20: 56 64 62 65 4f 70 33 28 70 56 64 62 65 2c 20 4f  VdbeOp3(pVdbe, O
0d30: 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c  P_TableLock, p1,
0d40: 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e 7a 4e 61   p->iTab, p->zNa
0d50: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
0d60: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64    }.}.#else.  #d
0d70: 65 66 69 6e 65 20 63 6f 64 65 54 61 62 6c 65 4c  efine codeTableL
0d80: 6f 63 6b 73 28 78 29 0a 23 65 6e 64 69 66 0a 0a  ocks(x).#endif..
0d90: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0da0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0db0: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0dc0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0dd0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0de0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0df0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0e00: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0e10: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0e20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0e30: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0e40: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0e50: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0e60: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0e70: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0e80: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0e90: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0ea0: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0eb0: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0ec0: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0ed0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0ee0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0ef0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0f00: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0f10: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0f20: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
0f30: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
0f40: 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  f( sqlite3Malloc
0f50: 46 61 69 6c 65 64 28 29 20 29 20 72 65 74 75 72  Failed() ) retur
0f60: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
0f70: 3e 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e  >nested ) return
0f80: 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  ;.  if( !pParse-
0f90: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 69 66  >pVdbe ){.    if
0fa0: 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51  ( pParse->rc==SQ
0fb0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 72 73  LITE_OK && pPars
0fc0: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20  e->nErr ){.     
0fd0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
0fe0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
0ff0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
1000: 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
1010: 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20 73 6f  by generating so
1020: 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  me termination c
1030: 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ode at the end o
1040: 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 65 20  f the.  ** vdbe 
1050: 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 20 64  program.  */.  d
1060: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1070: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1080: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1090: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
10a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10b0: 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b   OP_Halt, 0, 0);
10c0: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f  ..    /* The coo
10d0: 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  kie mask contain
10e0: 73 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  s one bit for ea
10f0: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
1100: 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42   open..    ** (B
1110: 69 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e  it 0 is for main
1120: 2c 20 62 69 74 20 31 20 69 73 20 66 6f 72 20 74  , bit 1 is for t
1130: 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  emp, and so fort
1140: 68 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20 20  h.)  Bits are.  
1150: 20 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63    ** set for eac
1160: 68 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  h database that 
1170: 69 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61  is used.  Genera
1180: 74 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74  te code to start
1190: 20 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61   a.    ** transa
11a0: 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73  ction on each us
11b0: 65 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ed database and 
11c0: 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 73 63  to verify the sc
11d0: 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20  hema cookie.    
11e0: 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20  ** on each used 
11f0: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
1200: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
1210: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30 20 29 7b  >cookieGoto>0 ){
1220: 0a 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b  .      u32 mask;
1230: 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a  .      int iDb;.
1240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1250: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 50 61  eJumpHere(v, pPa
1260: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d  rse->cookieGoto-
1270: 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44  1);.      for(iD
1280: 62 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62  b=0, mask=1; iDb
1290: 3c 64 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c  <db->nDb; mask<<
12a0: 3d 31 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20  =1, iDb++){.    
12b0: 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
12c0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
12d0: 73 6b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  sk)==0 ) continu
12e0: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
12f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1300: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
1310: 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72  Db, (mask & pPar
1320: 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d  se->writeMask)!=
1330: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
1340: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1350: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c  OP_VerifyCookie,
1360: 20 69 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f   iDb, pParse->co
1370: 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b  okieValue[iDb]);
1380: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
1390: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
13a0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
13b0: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56 69 72  if( pParse->pVir
13c0: 74 75 61 6c 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  tualLock ){.    
13d0: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
13e0: 20 28 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d   (char *)pParse-
13f0: 3e 70 56 69 72 74 75 61 6c 4c 6f 63 6b 2d 3e 70  >pVirtualLock->p
1400: 56 74 61 62 3b 0a 20 20 20 20 20 20 20 20 73 71  Vtab;.        sq
1410: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
1420: 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c 20 30 2c  OP_VBegin, 0, 0,
1430: 20 76 74 61 62 2c 20 50 33 5f 56 54 41 42 29 3b   vtab, P3_VTAB);
1440: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1450: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61  .      /* Once a
1460: 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65 73 20 68  ll the cookies h
1470: 61 76 65 20 62 65 65 6e 20 76 65 72 69 66 69 65  ave been verifie
1480: 64 20 61 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  d and transactio
1490: 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20  ns opened, .    
14a0: 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20    ** obtain the 
14b0: 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 2d 6c  required table-l
14c0: 6f 63 6b 73 2e 20 54 68 69 73 20 69 73 20 61 20  ocks. This is a 
14d0: 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 74 68 65  no-op unless the
14e0: 20 0a 20 20 20 20 20 20 2a 2a 20 73 68 61 72 65   .      ** share
14f0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
1500: 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20  is enabled..    
1510: 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 54    */.      codeT
1520: 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61 72 73 65  ableLocks(pParse
1530: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1540: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1550: 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d  Goto, 0, pParse-
1560: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20 20  >cookieGoto);.  
1570: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
1580: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
1590: 20 20 20 2f 2a 20 41 64 64 20 61 20 4e 6f 2d 6f     /* Add a No-o
15a0: 70 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  p that contains 
15b0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
15c0: 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 69 6c 65  t of the compile
15d0: 64 20 53 51 4c 0a 20 20 20 20 2a 2a 20 73 74 61  d SQL.    ** sta
15e0: 74 65 6d 65 6e 74 20 61 73 20 69 74 73 20 50 33  tement as its P3
15f0: 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73   argument.  This
1600: 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65   does not change
1610: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69   the functionali
1620: 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ty.    ** of the
1630: 20 70 72 6f 67 72 61 6d 2e 20 0a 20 20 20 20 2a   program. .    *
1640: 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  *.    ** This is
1650: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
1660: 6e 74 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65  nt sqlite3_trace
1670: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ()..    */.    s
1680: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
1690: 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20   OP_Noop, 0, 0, 
16a0: 70 50 61 72 73 65 2d 3e 7a 53 71 6c 2c 20 70 50  pParse->zSql, pP
16b0: 61 72 73 65 2d 3e 7a 54 61 69 6c 2d 70 50 61 72  arse->zTail-pPar
16c0: 73 65 2d 3e 7a 53 71 6c 29 3b 0a 23 65 6e 64 69  se->zSql);.#endi
16d0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
16e0: 5f 54 52 41 43 45 20 2a 2f 0a 20 20 7d 0a 0a 0a  _TRACE */.  }...
16f0: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42    /* Get the VDB
1700: 45 20 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20  E program ready 
1710: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20  for execution.  
1720: 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70 50  */.  if( v && pP
1730: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26  arse->nErr==0 &&
1740: 20 21 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46   !sqlite3MallocF
1750: 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 46  ailed() ){.    F
1760: 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62  ILE *trace = (db
1770: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1780: 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f  _VdbeTrace)!=0 ?
1790: 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20   stdout : 0;.   
17a0: 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 63   sqlite3VdbeTrac
17b0: 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 20 20 20  e(v, trace);.   
17c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
17d0: 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65 2d  Ready(v, pParse-
17e0: 3e 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e  >nVar, pParse->n
17f0: 4d 65 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20 20  Mem+3,.         
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1810: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c 20  pParse->nTab+3, 
1820: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29  pParse->explain)
1830: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
1840: 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1850: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e      pParse->colN
1860: 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d  amesSet = 0;.  }
1870: 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d  else if( pParse-
1880: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1890: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
18a0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
18b0: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
18c0: 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Tab = 0;.  pPars
18d0: 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70  e->nMem = 0;.  p
18e0: 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b  Parse->nSet = 0;
18f0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20  .  pParse->nVar 
1900: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  = 0;.  pParse->c
1910: 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 20  ookieMask = 0;. 
1920: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1930: 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  oto = 0;.}../*.*
1940: 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72  * Run the parser
1950: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1960: 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20  tor recursively 
1970: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65  in order to gene
1980: 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72  rate.** code for
1990: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
19a0: 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68  nt given onto th
19b0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61  e end of the pPa
19c0: 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63  rse context.** c
19d0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
19e0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68  onstruction.  Wh
19f0: 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73  en the parser is
1a00: 20 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79   run recursively
1a10: 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68  .** this way, th
1a20: 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20  e final OP_Halt 
1a30: 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20  is not appended 
1a40: 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61  and other initia
1a50: 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  lization.** and 
1a60: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65  finalization ste
1a70: 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62  ps are omitted b
1a80: 65 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65  ecause those are
1a90: 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65   handling by the
1aa0: 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61  .** outermost pa
1ab0: 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  rser..**.** Not 
1ac0: 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65  everything is ne
1ad0: 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61  stable.  This fa
1ae0: 63 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e  cility is design
1af0: 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20  ed to permit.** 
1b00: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
1b10: 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61  and DELETE opera
1b20: 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51  tions against SQ
1b30: 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73  LITE_MASTER.  Us
1b40: 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75  e.** care if you
1b50: 20 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74   decide to try t
1b60: 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69  o use this routi
1b70: 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ne for some othe
1b80: 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76  r purposes..*/.v
1b90: 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65  oid sqlite3Neste
1ba0: 64 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50  dParse(Parse *pP
1bb0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
1bc0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
1bd0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
1be0: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 23 20 64   char *zSql;.# d
1bf0: 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28  efine SAVE_SZ  (
1c00: 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20  sizeof(Parse) - 
1c10: 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e  offsetof(Parse,n
1c20: 56 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76  Var)).  char sav
1c30: 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a  eBuf[SAVE_SZ];..
1c40: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1c50: 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  rr ) return;.  a
1c60: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1c70: 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20  ested<10 );  /* 
1c80: 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f  Nesting should o
1c90: 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65  nly be of limite
1ca0: 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f  d depth */.  va_
1cb0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
1cc0: 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  t);.  zSql = sql
1cd0: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f  ite3VMPrintf(zFo
1ce0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
1cf0: 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a  end(ap);.  if( z
1d00: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Sql==0 ){.    re
1d10: 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c  turn;   /* A mal
1d20: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1d30: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50  iled */.  }.  pP
1d40: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a  arse->nested++;.
1d50: 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66    memcpy(saveBuf
1d60: 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  , &pParse->nVar,
1d70: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d   SAVE_SZ);.  mem
1d80: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  set(&pParse->nVa
1d90: 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  r, 0, SAVE_SZ);.
1da0: 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73    sqlite3RunPars
1db0: 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c  er(pParse, zSql,
1dc0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65   0);.  sqliteFre
1dd0: 65 28 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70  e(zSql);.  memcp
1de0: 79 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  y(&pParse->nVar,
1df0: 20 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53   saveBuf, SAVE_S
1e00: 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65  Z);.  pParse->ne
1e10: 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sted--;.}../*.**
1e20: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
1e30: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
1e40: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
1e50: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
1e60: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
1e70: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
1e80: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
1e90: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
1ea0: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
1eb0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
1ec0: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
1ed0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
1ee0: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
1ef0: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
1f00: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
1f10: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
1f20: 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74   the table and t
1f30: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63  he.** first matc
1f40: 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65  hing table is re
1f50: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
1f60: 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63  cking for duplic
1f70: 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  ate table.** nam
1f80: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
1f90: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
1fa0: 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  s TEMP first, th
1fb0: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
1fc0: 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64  y.** auxiliary d
1fd0: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75  atabases added u
1fe0: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
1ff0: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53  command..**.** S
2000: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c  ee also sqlite3L
2010: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f  ocateTable()..*/
2020: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46  .Table *sqlite3F
2030: 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33  indTable(sqlite3
2040: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
2050: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
2060: 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b  har *zDatabase){
2070: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b  .  Table *p = 0;
2080: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
2090: 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a  rt( zName!=0 );.
20a0: 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d    for(i=OMIT_TEM
20b0: 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  PDB; i<db->nDb; 
20c0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
20d0: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
20e0: 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54  i;   /* Search T
20f0: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
2100: 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61  */.    if( zData
2110: 62 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74  base!=0 && sqlit
2120: 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62  e3StrICmp(zDatab
2130: 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ase, db->aDb[j].
2140: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
2150: 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  e;.    p = sqlit
2160: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
2170: 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e  aDb[j].pSchema->
2180: 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  tblHash, zName, 
2190: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29  strlen(zName)+1)
21a0: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72  ;.    if( p ) br
21b0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
21c0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n p;.}../*.** Lo
21d0: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
21e0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
21f0: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
2200: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
2210: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
2220: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2230: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
2240: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
2250: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
2260: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
2270: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
2280: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
2290: 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76  ound.  Also leav
22a0: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65  e an.** error me
22b0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
22c0: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
22d0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
22e0: 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
22f0: 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46  ine and sqlite3F
2300: 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74 68  indTable() is th
2310: 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  at this.** routi
2320: 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72  ne leaves an err
2330: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
2340: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68  arse->zErrMsg wh
2350: 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69  ere.** sqlite3Fi
2360: 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e  ndTable() does n
2370: 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ot..*/.Table *sq
2380: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
2390: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
23a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
23b0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
23c0: 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  Dbase){.  Table 
23d0: 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74  *p;..  /* Read t
23e0: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
23f0: 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
2400: 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
2410: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
2420: 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
2430: 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
2440: 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28  n NULL. */.  if(
2450: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
2460: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
2470: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
2480: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20  urn 0;.  }..  p 
2490: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
24a0: 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
24b0: 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20  Name, zDbase);. 
24c0: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
24d0: 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20   if( zDbase ){. 
24e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
24f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
2500: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 2e   such table: %s.
2510: 25 73 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61  %s", zDbase, zNa
2520: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
2530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2540: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
2550: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
2560: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  ", zName);.    }
2570: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
2580: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
2590: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
25a0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
25b0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
25c0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
25d0: 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69  ibes .** a parti
25e0: 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65  cular index give
25f0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
2600: 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  at index.** and 
2610: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
2620: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f  database that co
2630: 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78  ntains the index
2640: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ..** Return NULL
2650: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
2660: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
2670: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
2680: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
2690: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61  ed for the.** ta
26a0: 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73  ble and the firs
26b0: 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78  t matching index
26c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
26d0: 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66  No checking.** f
26e0: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64  or duplicate ind
26f0: 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ex names is done
2700: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
2710: 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20  rder is.** TEMP 
2720: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
2730: 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c  , then any auxil
2740: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
2750: 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68  dded.** using th
2760: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
2770: 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ..*/.Index *sqli
2780: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c  te3FindIndex(sql
2790: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
27a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
27b0: 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
27c0: 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20   Index *p = 0;. 
27d0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
27e0: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
27f0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2800: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
2810: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
2820: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
2830: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63  e MAIN */.    Sc
2840: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
2850: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
2860: 6d 61 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20  ma;.    if( zDb 
2870: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2880: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
2890: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
28a0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
28b0: 20 70 53 63 68 65 6d 61 20 7c 7c 20 28 6a 3d 3d   pSchema || (j==
28c0: 31 20 26 26 20 21 64 62 2d 3e 61 44 62 5b 31 5d  1 && !db->aDb[1]
28d0: 2e 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28  .pBt) );.    if(
28e0: 20 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   pSchema ){.    
28f0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
2900: 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e  hFind(&pSchema->
2910: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  idxHash, zName, 
2920: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29  strlen(zName)+1)
2930: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2940: 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  p ) break;.  }. 
2950: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
2960: 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20  .** Reclaim the 
2970: 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61  memory used by a
2980: 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69  n index.*/.stati
2990: 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78  c void freeIndex
29a0: 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73 71  (Index *p){.  sq
29b0: 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 43 6f 6c  liteFree(p->zCol
29c0: 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  Aff);.  sqliteFr
29d0: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
29e0: 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e  Remove the given
29f0: 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20   index from the 
2a00: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
2a10: 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74  , and free.** it
2a20: 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  s memory structu
2a30: 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  res..**.** The i
2a40: 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20  ndex is removed 
2a50: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2a60: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 62 75  e hash tables bu
2a70: 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 75  t.** it is not u
2a80: 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65  nlinked from the
2a90: 20 54 61 62 6c 65 20 74 68 61 74 20 69 74 20 69   Table that it i
2aa0: 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e  ndexes..** Unlin
2ab0: 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 54 61  king from the Ta
2ac0: 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  ble must be done
2ad0: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
2ae0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
2af0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44  tic void sqliteD
2b00: 65 6c 65 74 65 49 6e 64 65 78 28 49 6e 64 65 78  eleteIndex(Index
2b10: 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70   *p){.  Index *p
2b20: 4f 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Old;.  const cha
2b30: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e  r *zName = p->zN
2b40: 61 6d 65 3b 0a 0a 20 20 70 4f 6c 64 20 3d 20 73  ame;..  pOld = s
2b50: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
2b60: 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  (&p->pSchema->id
2b70: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  xHash, zName, st
2b80: 72 6c 65 6e 28 20 7a 4e 61 6d 65 29 2b 31 2c 20  rlen( zName)+1, 
2b90: 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  0);.  assert( pO
2ba0: 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70  ld==0 || pOld==p
2bb0: 20 29 3b 0a 20 20 66 72 65 65 49 6e 64 65 78 28   );.  freeIndex(
2bc0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  p);.}../*.** For
2bd0: 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c 65   the index calle
2be0: 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63 68  d zIdxName which
2bf0: 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   is found in the
2c00: 20 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a 2a   database iDb,.*
2c10: 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e  * unlike that in
2c20: 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61 62  dex from its Tab
2c30: 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  le then remove t
2c40: 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a  he index from.**
2c50: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
2c60: 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20 61  table and free a
2c70: 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ll memory struct
2c80: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ures associated.
2c90: 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64 65  ** with the inde
2ca0: 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
2cb0: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
2cc0: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  eIndex(sqlite3 *
2cd0: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
2ce0: 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d  st char *zIdxNam
2cf0: 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
2d00: 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  dex;.  int len;.
2d10: 20 20 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20    Hash *pHash = 
2d20: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  &db->aDb[iDb].pS
2d30: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a  chema->idxHash;.
2d40: 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  .  len = strlen(
2d50: 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e  zIdxName);.  pIn
2d60: 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73  dex = sqlite3Has
2d70: 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a  hInsert(pHash, z
2d80: 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c 20  IdxName, len+1, 
2d90: 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  0);.  if( pIndex
2da0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   ){.    if( pInd
2db0: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
2dc0: 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  ex==pIndex ){.  
2dd0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62      pIndex->pTab
2de0: 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  le->pIndex = pIn
2df0: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
2e00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
2e10: 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72  ex *p;.      for
2e20: 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  (p=pIndex->pTabl
2e30: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20  e->pIndex; p && 
2e40: 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78  p->pNext!=pIndex
2e50: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  ; p=p->pNext){}.
2e60: 20 20 20 20 20 20 69 66 28 20 70 20 26 26 20 70        if( p && p
2e70: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20  ->pNext==pIndex 
2e80: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  ){.        p->pN
2e90: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
2ea0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
2eb0: 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78   }.    freeIndex
2ec0: 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20  (pIndex);.  }.  
2ed0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
2ee0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
2ef0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  s;.}../*.** Eras
2f00: 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66  e all schema inf
2f10: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
2f20: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
2f30: 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20   tables of.** a 
2f40: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 2e  single database.
2f50: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
2f60: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c  s called to recl
2f70: 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65  aim memory.** be
2f80: 66 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  fore the databas
2f90: 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73  e closes.  It is
2fa0: 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72   also called dur
2fb0: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ing a rollback.*
2fc0: 2a 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20  * if there were 
2fd0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64  schema changes d
2fe0: 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61  uring the transa
2ff0: 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a  ction or if a.**
3000: 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d   schema-cookie m
3010: 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73 2e 0a  ismatch occurs..
3020: 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20  **.** If iDb<=0 
3030: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
3040: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74  nternal schema t
3050: 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61  ables for all da
3060: 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e  tabase.** files.
3070: 20 20 49 66 20 69 44 62 3e 3d 32 20 74 68 65 6e    If iDb>=2 then
3080: 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72   reset the inter
3090: 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f  nal schema for o
30a0: 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c  nly the.** singl
30b0: 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64  e file indicated
30c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
30d0: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
30e0: 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62  hema(sqlite3 *db
30f0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e  , int iDb){.  in
3100: 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72  t i, j;..  asser
3110: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
3120: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 66 6f  <db->nDb );.  fo
3130: 72 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e  r(i=iDb; i<db->n
3140: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
3150: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3160: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3170: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
3180: 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61     sqlite3Schema
3190: 46 72 65 65 28 70 44 62 2d 3e 70 53 63 68 65 6d  Free(pDb->pSchem
31a0: 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  a);.    }.    if
31b0: 28 20 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e  ( iDb>0 ) return
31c0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
31d0: 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e  iDb==0 );.  db->
31e0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
31f0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
3200: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20  .  /* If one or 
3210: 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78 69  more of the auxi
3220: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66  liary database f
3230: 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63 6c  iles has been cl
3240: 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  osed,.  ** then 
3250: 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d  remove them from
3260: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
3270: 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20 57  atabase list.  W
3280: 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20  e take the.  ** 
3290: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 64  opportunity to d
32a0: 6f 20 74 68 69 73 20 68 65 72 65 20 73 69 6e 63  o this here sinc
32b0: 65 20 77 65 20 68 61 76 65 20 6a 75 73 74 20 64  e we have just d
32c0: 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74 68  eleted all of th
32d0: 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68 61  e.  ** schema ha
32e0: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
32f0: 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68  erefore do not h
3300: 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20  ave to make any 
3310: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20  changes.  ** to 
3320: 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61 62  any of those tab
3330: 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  les..  */.  for(
3340: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
3350: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
3360: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
3370: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
3380: 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20  pDb->pBt==0 ){. 
3390: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 41       if( pDb->pA
33a0: 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72 65 65  ux && pDb->xFree
33b0: 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72 65 65  Aux ) pDb->xFree
33c0: 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a  Aux(pDb->pAux);.
33d0: 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75 78 20        pDb->pAux 
33e0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
33f0: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
3400: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
3410: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
3420: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
3430: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
3440: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
3450: 74 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e 61 6d  teFree(pDb->zNam
3460: 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  e);.      pDb->z
3470: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
3480: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
3490: 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20      if( j<i ){. 
34a0: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20       db->aDb[j] 
34b0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20  = db->aDb[i];.  
34c0: 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d    }.    j++;.  }
34d0: 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61  .  memset(&db->a
34e0: 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e  Db[j], 0, (db->n
34f0: 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d  Db-j)*sizeof(db-
3500: 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d  >aDb[j]));.  db-
3510: 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20  >nDb = j;.  if( 
3520: 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62  db->nDb<=2 && db
3530: 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74  ->aDb!=db->aDbSt
3540: 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63  atic ){.    memc
3550: 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63  py(db->aDbStatic
3560: 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a  , db->aDb, 2*siz
3570: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29  eof(db->aDb[0]))
3580: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
3590: 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64  (db->aDb);.    d
35a0: 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  b->aDb = db->aDb
35b0: 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Static;.  }.}../
35c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
35d0: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
35e0: 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73   a commit occurs
35f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3600: 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
3610: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
3620: 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  db){.  db->flags
3630: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
3640: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
3650: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
3660: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
3670: 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2e  a table or view.
3680: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3690: 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d  sqliteResetColum
36a0: 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70 54  nNames(Table *pT
36b0: 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  able){.  int i;.
36c0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
36d0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
36e0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43  !=0 );.  if( (pC
36f0: 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ol = pTable->aCo
3700: 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  l)!=0 ){.    for
3710: 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  (i=0; i<pTable->
3720: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
3730: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
3740: 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  Free(pCol->zName
3750: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3760: 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d  ExprDelete(pCol-
3770: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73  >pDflt);.      s
3780: 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e  qliteFree(pCol->
3790: 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71  zType);.      sq
37a0: 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a  liteFree(pCol->z
37b0: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Coll);.    }.   
37c0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
37d0: 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 20  le->aCol);.  }. 
37e0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
37f0: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  0;.  pTable->nCo
3800: 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l = 0;.}../*.** 
3810: 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72  Remove the memor
3820: 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  y data structure
3830: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3840: 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54  h the given.** T
3850: 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65  able.  No change
3860: 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69  s are made to di
3870: 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  sk by this routi
3880: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ne..**.** This r
3890: 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65  outine just dele
38a0: 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72  tes the data str
38b0: 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73  ucture.  It does
38c0: 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74   not unlink.** t
38d0: 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74  he table data st
38e0: 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
38f0: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f   hash table.  No
3900: 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76 65  r does it remove
3910: 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  .** foreign keys
3920: 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65   from the sqlite
3930: 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c  .aFKey hash tabl
3940: 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20  e.  But it does 
3950: 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72  destroy.** memor
3960: 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  y structures of 
3970: 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  the indices and 
3980: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73  foreign keys ass
3990: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a  ociated with .**
39a0: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76   the table..*/.v
39b0: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74  oid sqlite3Delet
39c0: 65 54 61 62 6c 65 28 54 61 62 6c 65 20 2a 70 54  eTable(Table *pT
39d0: 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  able){.  Index *
39e0: 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a  pIndex, *pNext;.
39f0: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a    FKey *pFKey, *
3a00: 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20 69 66  pNextFKey;..  if
3a10: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65  ( pTable==0 ) re
3a20: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e  turn;..  /* Do n
3a30: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 61  ot delete the ta
3a40: 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65  ble until the re
3a50: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65  ference count re
3a60: 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20  aches zero. */. 
3a70: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b   pTable->nRef--;
3a80: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
3a90: 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  Ref>0 ){.    ret
3aa0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
3ab0: 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d  t( pTable->nRef=
3ac0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  =0 );..  /* Dele
3ad0: 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  te all indices a
3ae0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3af0: 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  his table.  */. 
3b00: 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54   for(pIndex = pT
3b10: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
3b20: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65  ndex; pIndex=pNe
3b30: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
3b40: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
3b50: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
3b60: 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  ex->pSchema==pTa
3b70: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  ble->pSchema );.
3b80: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
3b90: 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20  Index(pIndex);. 
3ba0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
3bb0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
3bc0: 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  KEY.  /* Delete 
3bd0: 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  all foreign keys
3be0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3bf0: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68   this table.  Th
3c00: 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75  e keys.  ** shou
3c10: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
3c20: 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72  been unlinked fr
3c30: 6f 6d 20 74 68 65 20 70 53 63 68 65 6d 61 2d 3e  om the pSchema->
3c40: 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65  aFKey hash table
3c50: 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b   .  */.  for(pFK
3c60: 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79  ey=pTable->pFKey
3c70: 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70  ; pFKey; pFKey=p
3c80: 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20 70  NextFKey){.    p
3c90: 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65 79  NextFKey = pFKey
3ca0: 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20  ->pNextFrom;.   
3cb0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3cc0: 48 61 73 68 46 69 6e 64 28 26 70 54 61 62 6c 65  HashFind(&pTable
3cd0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79  ->pSchema->aFKey
3ce0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 4b               pFK
3d00: 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28  ey->zTo, strlen(
3d10: 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d  pFKey->zTo)+1)!=
3d20: 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c  pFKey );.    sql
3d30: 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a  iteFree(pFKey);.
3d40: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
3d50: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c   Delete the Tabl
3d60: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
3d70: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  lf..  */.  sqlit
3d80: 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  eResetColumnName
3d90: 73 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c  s(pTable);.  sql
3da0: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
3db0: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
3dc0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 43 6f  Free(pTable->zCo
3dd0: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  lAff);.  sqlite3
3de0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61  SelectDelete(pTa
3df0: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 23  ble->pSelect);.#
3e00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3e10: 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69 74  IT_CHECK.  sqlit
3e20: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 54 61  e3ExprDelete(pTa
3e30: 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65  ble->pCheck);.#e
3e40: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 74  ndif.  sqlite3Vt
3e50: 61 62 43 6c 65 61 72 28 70 54 61 62 6c 65 29 3b  abClear(pTable);
3e60: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
3e70: 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  able);.}../*.** 
3e80: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
3e90: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
3ea0: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
3eb0: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
3ec0: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
3ed0: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
3ee0: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
3ef0: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
3f00: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
3f10: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
3f20: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
3f30: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
3f40: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
3f50: 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a 70 46  e *p;.  FKey *pF
3f60: 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20 2a 70  1, *pF2;.  Db *p
3f70: 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  Db;..  assert( d
3f80: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
3f90: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
3fa0: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
3fb0: 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 26 26  ert( zTabName &&
3fc0: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a   zTabName[0] );.
3fd0: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
3fe0: 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c  [iDb];.  p = sql
3ff0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
4000: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
4010: 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c  lHash, zTabName,
4020: 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65   strlen(zTabName
4030: 29 2b 31 2c 30 29 3b 0a 20 20 69 66 28 20 70 20  )+1,0);.  if( p 
4040: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
4050: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
4060: 45 59 0a 20 20 20 20 66 6f 72 28 70 46 31 3d 70  EY.    for(pF1=p
4070: 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b 20 70 46  ->pFKey; pF1; pF
4080: 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d  1=pF1->pNextFrom
4090: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  ){.      int nTo
40a0: 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d 3e 7a   = strlen(pF1->z
40b0: 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  To) + 1;.      p
40c0: 46 32 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  F2 = sqlite3Hash
40d0: 46 69 6e 64 28 26 70 44 62 2d 3e 70 53 63 68 65  Find(&pDb->pSche
40e0: 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e  ma->aFKey, pF1->
40f0: 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20  zTo, nTo);.     
4100: 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29 7b   if( pF2==pF1 ){
4110: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4120: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
4130: 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c  >pSchema->aFKey,
4140: 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20   pF1->zTo, nTo, 
4150: 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a 20  pF1->pNextTo);. 
4160: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4170: 20 20 20 20 77 68 69 6c 65 28 20 70 46 32 20 26      while( pF2 &
4180: 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21 3d  & pF2->pNextTo!=
4190: 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32 2d 3e  pF1 ){ pF2=pF2->
41a0: 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20 20  pNextTo; }.     
41b0: 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20 20     if( pF2 ){.  
41c0: 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70 4e 65          pF2->pNe
41d0: 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78  xtTo = pF1->pNex
41e0: 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tTo;.        }. 
41f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
4200: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44  dif.    sqlite3D
4210: 65 6c 65 74 65 54 61 62 6c 65 28 70 29 3b 0a 20  eleteTable(p);. 
4220: 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c   }.  db->flags |
4230: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
4240: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
4250: 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20   Given a token, 
4260: 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  return a string 
4270: 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
4280: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61   the text of tha
4290: 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74 68 20  t.** token with 
42a0: 61 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73 20 72  any quotations r
42b0: 65 6d 6f 76 65 64 2e 20 20 53 70 61 63 65 20 74  emoved.  Space t
42c0: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
42d0: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
42e0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
42f0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
4300: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
4310: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
4320: 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  * function..**.*
4330: 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74  * Tokens are oft
4340: 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73  en just pointers
4350: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
4360: 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20  al SQL text and 
4370: 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30  so.** are not \0
4380: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
4390: 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73  d are not persis
43a0: 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72  tent.  The retur
43b0: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
43c0: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
43d0: 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65   and is persiste
43e0: 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nt..*/.char *sql
43f0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4400: 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  n(Token *pName){
4410: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
4420: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
4430: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
4440: 65 53 74 72 4e 44 75 70 28 28 63 68 61 72 2a 29  eStrNDup((char*)
4450: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
4460: 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >n);.    sqlite3
4470: 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
4480: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61    }else{.    zNa
4490: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
44a0: 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f  turn zName;.}../
44b0: 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71  *.** Open the sq
44c0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
44d0: 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61  e stored in data
44e0: 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20  base number iDb 
44f0: 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20  for.** writing. 
4500: 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65  The table is ope
4510: 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72  ned using cursor
4520: 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
4530: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
4540: 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74  le(Parse *p, int
4550: 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
4560: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
4570: 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54  e(p);.  sqlite3T
4580: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c  ableLock(p, iDb,
4590: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c   MASTER_ROOT, 1,
45a0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
45b0: 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  b));.  sqlite3Vd
45c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
45d0: 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a  teger, iDb, 0);.
45e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
45f0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  Op(v, OP_OpenWri
4600: 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f  te, 0, MASTER_RO
4610: 4f 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  OT);.  sqlite3Vd
4620: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
4630: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20  tNumColumns, 0, 
4640: 35 29 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61  5); /* sqlite_ma
4650: 73 74 65 72 20 68 61 73 20 35 20 63 6f 6c 75 6d  ster has 5 colum
4660: 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ns */.}../*.** T
4670: 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  he token *pName 
4680: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
4690: 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  e of a database 
46a0: 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f  (either "main" o
46b0: 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74  r.** "temp" or t
46c0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74  he name of an at
46d0: 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73  tached db). This
46e0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
46f0: 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66   the.** index of
4700: 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62   the named datab
4710: 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  ase in db->aDb[]
4720: 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e  , or -1 if the n
4730: 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73  amed db .** does
4740: 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69   not exist..*/.i
4750: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62  nt sqlite3FindDb
4760: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
4770: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69  ken *pName){.  i
4780: 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 2f 2a  nt i = -1;    /*
4790: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
47a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
47b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
47c0: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
47d0: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 44 62  the name */.  Db
47e0: 20 2a 70 44 62 3b 20 20 20 20 20 20 20 2f 2a 20   *pDb;       /* 
47f0: 41 20 64 61 74 61 62 61 73 65 20 77 68 6f 73 65  A database whose
4800: 20 6e 61 6d 65 20 73 70 61 63 65 20 69 73 20 62   name space is b
4810: 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 2a 2f  eing searched */
4820: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
4830: 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65    /* Name we are
4840: 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a   searching for *
4850: 2f 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  /..  zName = sql
4860: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4870: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(pName);.  if( 
4880: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 20 3d  zName ){.    n =
4890: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a   strlen(zName);.
48a0: 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e      for(i=(db->n
48b0: 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e  Db-1), pDb=&db->
48c0: 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d  aDb[i]; i>=0; i-
48d0: 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20  -, pDb--){.     
48e0: 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50   if( (!OMIT_TEMP
48f0: 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20  DB || i!=1 ) && 
4900: 6e 3d 3d 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a  n==strlen(pDb->z
4910: 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20  Name) && .      
4920: 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74      0==sqlite3St
4930: 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65  rICmp(pDb->zName
4940: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
4950: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4960: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
4970: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
4980: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
4990: 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  }../* The table 
49a0: 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67  or view or trigg
49b0: 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65  er name is passe
49c0: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
49d0: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e via tokens.** 
49e0: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
49f0: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
4a00: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
4a10: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
4a20: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45  ample:.**.** CRE
4a30: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
4a40: 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20  y (...);.** .** 
4a50: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
4a60: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
4a70: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
4a80: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
4a90: 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  if.** the table 
4aa0: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
4ab0: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
4ac0: 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  .:.**.** CREATE 
4ad0: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
4ae0: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  **.** Then pName
4af0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
4b00: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
4b10: 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ""..**.** This r
4b20: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
4b30: 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65  *ppUnqual pointe
4b40: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
4b50: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
4b60: 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  or.** pName2) th
4b70: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
4b80: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
4b90: 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78  name.  The index
4ba0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
4bb0: 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74  ase "xxx" is ret
4bc0: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
4bd0: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
4be0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4bf0: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
4c00: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
4c10: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
4c20: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
4c30: 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  1,      /* The "
4c40: 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  xxx" in the name
4c50: 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78   "xxx.yyy" or "x
4c60: 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  xx" */.  Token *
4c70: 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20  pName2,      /* 
4c80: 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65  The "yyy" in the
4c90: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
4ca0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e  */.  Token **pUn
4cb0: 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74  qual     /* Writ
4cc0: 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  e the unqualifie
4cd0: 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65  d object name he
4ce0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
4cf0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
4d00: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
4d10: 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f  se holding the o
4d20: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
4d30: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
4d40: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61 6d  >db;..  if( pNam
4d50: 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e  e2 && pName2->n>
4d60: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
4d70: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
4d80: 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  );.    *pUnqual 
4d90: 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44  = pName2;.    iD
4da0: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
4db0: 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  b(db, pName1);. 
4dc0: 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a     if( iDb<0 ){.
4dd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
4de0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
4df0: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20  nknown database 
4e00: 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  %T", pName1);.  
4e10: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
4e20: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
4e30: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   -1;.    }.  }el
4e40: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
4e50: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20  db->init.iDb==0 
4e60: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
4e70: 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62   );.    iDb = db
4e80: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
4e90: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
4ea0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
4eb0: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  iDb;.}../*.** Th
4ec0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
4ed0: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
4ee0: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
4ef0: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
4f00: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
4f10: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
4f20: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
4f30: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
4f40: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
4f50: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
4f60: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
4f70: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
4f80: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
4f90: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
4fa0: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
4fb0: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
4fc0: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
4fd0: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
4fe0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
4ff0: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
5000: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
5010: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
5020: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
5030: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
5040: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
5050: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
5060: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20  e->nested==0 .  
5070: 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72          && (pPar
5080: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
5090: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
50a0: 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ma)==0.         
50b0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
50c0: 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  rNICmp(zName, "s
50d0: 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20  qlite_", 7) ){. 
50e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
50f0: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65  sg(pParse, "obje
5100: 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64  ct name reserved
5110: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73   for internal us
5120: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
5130: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5140: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
5150: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5160: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
5170: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e  constructing a n
5180: 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65  ew table represe
5190: 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72  ntation in memor
51a0: 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74  y.  This is.** t
51b0: 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65  he first of seve
51c0: 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ral action routi
51d0: 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c  nes that get cal
51e0: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a  led in response.
51f0: 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54  ** to a CREATE T
5200: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
5210: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
5220: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5230: 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20  called.** after 
5240: 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43  seeing tokens "C
5250: 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c  REATE" and "TABL
5260: 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  E" and the table
5270: 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d   name. The isTem
5280: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
5290: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
52a0: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
52b0: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
52c0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
52d0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
52e0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
52f0: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
5300: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
5310: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
5320: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
5330: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
5340: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
5350: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
5360: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
5370: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
5380: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
5390: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
53a0: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
53b0: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
53c0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
53d0: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
53e0: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
53f0: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
5400: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
5410: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
5420: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
5430: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
5440: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
5450: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5460: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
5470: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
5480: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
5490: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
54a0: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
54b0: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
54c0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
54d0: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
54e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
54f0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
5500: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
5510: 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
5520: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  t part of the na
5530: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
5540: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  or view */.  Tok
5550: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
5560: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
5570: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
5580: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
5590: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
55a0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
55b0: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
55c0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
55d0: 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  iew,      /* Tru
55e0: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
55f0: 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  IEW */.  int isV
5600: 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75  irtual,   /* Tru
5610: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
5620: 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a  IRTUAL table */.
5630: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
5640: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
5650: 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64   if table alread
5660: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
5670: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
5680: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
5690: 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f  0; /* The name o
56a0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
56b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
56c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
56d0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
56e0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
56f0: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
5700: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
5710: 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ble in */.  Toke
5720: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  n *pName;    /* 
5730: 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
5740: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
5750: 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a   create */..  /*
5760: 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   The table or vi
5770: 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74  ew name to creat
5780: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
5790: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
57a0: 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d  tokens.  ** pNam
57b0: 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49  e1 and pName2. I
57c0: 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  f the table name
57d0: 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69   was fully quali
57e0: 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  fied, for exampl
57f0: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45  e:.  **.  ** CRE
5800: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
5810: 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20  y (...);.  ** . 
5820: 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20   ** Then pName1 
5830: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
5840: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
5850: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
5860: 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  and if.  ** the 
5870: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
5880: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
5890: 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20  d, i.e.:.  **.  
58a0: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
58b0: 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20  yyy(...);.  **. 
58c0: 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20   ** Then pName1 
58d0: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
58e0: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
58f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
5900: 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20  call below sets 
5910: 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65  the pName pointe
5920: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
5930: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
5940: 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20  or.  ** pName2) 
5950: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
5960: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
5970: 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69  e name. The vari
5980: 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a  able iDb is.  **
5990: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
59a0: 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
59b0: 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  e that the table
59c0: 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20 62   or view is to b
59d0: 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69  e.  ** created i
59e0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20  n..  */.  iDb = 
59f0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
5a00: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
5a10: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
5a20: 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
5a30: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5a40: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
5a50: 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31 20  isTemp && iDb>1 
5a60: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65  ){.    /* If cre
5a70: 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62  ating a temp tab
5a80: 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79  le, the name may
5a90: 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65   not be qualifie
5aa0: 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
5ab0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5ac0: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
5ad0: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
5ae0: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
5af0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
5b00: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
5b10: 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62   && isTemp ) iDb
5b20: 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d   = 1;..  pParse-
5b30: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
5b40: 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  Name;.  zName = 
5b50: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
5b60: 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69  oken(pName);.  i
5b70: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
5b80: 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49  turn;.  if( SQLI
5b90: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
5ba0: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
5bb0: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
5bc0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
5bd0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
5be0: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
5bf0: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
5c00: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
5c10: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
5c20: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
5c30: 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73  (isTemp & 1)==is
5c40: 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20  Temp );.  {.    
5c50: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68  int code;.    ch
5c60: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
5c70: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
5c80: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
5c90: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
5ca0: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
5cb0: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
5cc0: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
5cd0: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
5ce0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
5cf0: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
5d00: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
5d10: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
5d20: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
5d30: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
5d40: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b  REATE_TEMP_VIEW;
5d50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5d60: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
5d70: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b  ITE_CREATE_VIEW;
5d80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5d90: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
5da0: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
5db0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
5dc0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
5dd0: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  EATE_TEMP_TABLE;
5de0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5df0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
5e00: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
5e10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5e20: 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75      if( !isVirtu
5e30: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74  al && sqlite3Aut
5e40: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
5e50: 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ode, zName, 0, z
5e60: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
5e70: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5e80: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ror;.    }.  }.#
5e90: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
5ea0: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
5eb0: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
5ec0: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
5ed0: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
5ee0: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
5ef0: 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ame in the same 
5f00: 64 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65  database.  Issue
5f10: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
5f20: 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65  e if.  ** it doe
5f30: 73 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  s. The exception
5f40: 20 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65   is if the state
5f50: 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65  ment being parse
5f60: 64 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a  d was passed.  *
5f70: 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  * to an sqlite3_
5f80: 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63  declare_vtab() c
5f90: 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73  all. In that cas
5fa0: 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  e only the colum
5fb0: 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64  n names.  ** and
5fc0: 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75   types will be u
5fd0: 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73  sed, so there is
5fe0: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74   no need to test
5ff0: 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20   for namespace. 
6000: 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a   ** collisions..
6010: 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44    */.  if( !IN_D
6020: 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20  ECLARE_VTAB ){. 
6030: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
6040: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
6050: 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
6060: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
6070: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
6080: 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20   }.    pTable = 
6090: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
60a0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e  (db, zName, db->
60b0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b  aDb[iDb].zName);
60c0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20  .    if( pTable 
60d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f  ){.      if( !no
60e0: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Err ){.        s
60f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6100: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54  Parse, "table %T
6110: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
6120: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , pName);.      
6130: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  }.      goto beg
6140: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6150: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
6160: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
6170: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20  b, zName, 0)!=0 
6180: 26 26 20 28 69 44 62 3d 3d 30 20 7c 7c 20 21 64  && (iDb==0 || !d
6190: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b  b->init.busy) ){
61a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
61b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
61c0: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
61d0: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
61e0: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
61f0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
6200: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
6210: 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d  .  }..  pTable =
6220: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
6230: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
6240: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
6250: 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  ){.    pParse->r
6260: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
6270: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
6280: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62  rr++;.    goto b
6290: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
62a0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  ;.  }.  pTable->
62b0: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
62c0: 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d   pTable->iPKey =
62d0: 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70   -1;.  pTable->p
62e0: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
62f0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  [iDb].pSchema;. 
6300: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20   pTable->nRef = 
6310: 31 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  1;.  if( pParse-
6320: 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c  >pNewTable ) sql
6330: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
6340: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6350: 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e  e);.  pParse->pN
6360: 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  ewTable = pTable
6370: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
6380: 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c  is the magic sql
6390: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
63a0: 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f 69  le used by autoi
63b0: 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74  ncrement,.  ** t
63c0: 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69  hen record a poi
63d0: 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61 62  nter to this tab
63e0: 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  le in the main d
63f0: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
6400: 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49  e.  ** so that I
6410: 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74  NSERT can find t
6420: 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e  he table easily.
6430: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
6440: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
6450: 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70  CREMENT.  if( !p
6460: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26  Parse->nested &&
6470: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22   strcmp(zName, "
6480: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22  sqlite_sequence"
6490: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62  )==0 ){.    pTab
64a0: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  le->pSchema->pSe
64b0: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
64c0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
64d0: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
64e0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
64f0: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
6500: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
6510: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
6520: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
6530: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
6540: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
6550: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
6560: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
6570: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
6580: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
6590: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
65a0: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
65b0: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
65c0: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
65d0: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
65e0: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
65f0: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
6600: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
6610: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
6620: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
6630: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
6640: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
6650: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
6660: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
6670: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
6680: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
6690: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
66a0: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
66b0: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
66c0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 62 6c  0 ){.    int lbl
66d0: 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f  ;.    int fileFo
66e0: 72 6d 61 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rmat;.    sqlite
66f0: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
6700: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
6710: 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
6720: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
6730: 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
6740: 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  isVirtual ){.   
6750: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6760: 64 4f 70 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  dOp(v, OP_VBegin
6770: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  , 0, 0);.    }.#
6780: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
6790: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
67a0: 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e   and encoding in
67b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
67c0: 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c  ve not been set,
67d0: 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65   .    ** set the
67e0: 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  m now..    */.  
67f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6800: 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f  Op(v, OP_ReadCoo
6810: 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 20 20 20  kie, iDb, 1);   
6820: 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20 2a  /* file_format *
6830: 2f 0a 20 20 20 20 6c 62 6c 20 3d 20 73 71 6c 69  /.    lbl = sqli
6840: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
6850: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
6860: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6870: 49 66 2c 20 30 2c 20 6c 62 6c 29 3b 0a 20 20 20  If, 0, lbl);.   
6880: 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64   fileFormat = (d
6890: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
68a0: 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29  E_LegacyFileFmt)
68b0: 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20  !=0 ?.          
68c0: 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49          1 : SQLI
68d0: 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d  TE_MAX_FILE_FORM
68e0: 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  AT;.    sqlite3V
68f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6900: 6e 74 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d  nteger, fileForm
6910: 61 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  at, 0);.    sqli
6920: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6930: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
6940: 62 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 1);.    sqlit
6950: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6960: 50 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64  P_Integer, ENC(d
6970: 62 29 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  b), 0);.    sqli
6980: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6990: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
69a0: 62 2c 20 34 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 4);.    sqlit
69b0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
69c0: 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 0a 20 20 20  el(v, lbl);..   
69d0: 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72   /* This just cr
69e0: 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f  eates a place-ho
69f0: 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74  lder record in t
6a00: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
6a10: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54   table..    ** T
6a20: 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65  he record create
6a30: 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  d does not conta
6a40: 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e  in anything yet.
6a50: 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70    It will be rep
6a60: 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  laced.    ** by 
6a70: 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69  the real entry i
6a80: 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  n code generated
6a90: 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61   at sqlite3EndTa
6aa0: 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ble()..    **.  
6ab0: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
6ac0: 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  or the new entry
6ad0: 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20   is left on the 
6ae0: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
6af0: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  ..    ** The row
6b00: 69 64 20 76 61 6c 75 65 20 69 73 20 6e 65 65 64  id value is need
6b10: 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74  ed by the code t
6b20: 68 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61  hat sqlite3EndTa
6b30: 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ble will.    ** 
6b40: 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f  generate..    */
6b50: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
6b60: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
6b70: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
6b80: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
6b90: 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73  ABLE).    if( is
6ba0: 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61  View || isVirtua
6bb0: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
6bc0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6bd0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
6be0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
6bf0: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73  if.    {.      s
6c00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6c10: 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  v, OP_CreateTabl
6c20: 65 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  e, iDb, 0);.    
6c30: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  }.    sqlite3Ope
6c40: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61  nMasterTable(pPa
6c50: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  rse, iDb);.    s
6c60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6c70: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
6c80: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
6c90: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6ca0: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
6cb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6cc0: 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  Op(v, OP_Null, 0
6cd0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6ce0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6cf0: 5f 49 6e 73 65 72 74 2c 20 30 2c 20 4f 50 46 4c  _Insert, 0, OPFL
6d00: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
6d10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6d20: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
6d30: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6d40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6d50: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  Pull, 1, 0);.  }
6d60: 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e  ..  /* Normal (n
6d70: 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e  on-error) return
6d80: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a  . */.  return;..
6d90: 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
6da0: 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70   occurs, we jump
6db0: 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74   here */.begin_t
6dc0: 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71  able_error:.  sq
6dd0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
6de0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
6df0: 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69  .** This macro i
6e00: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  s used to compar
6e10: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69 6e  e two strings in
6e20: 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74   a case-insensit
6e30: 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49  ive manner..** I
6e40: 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61  t is slightly fa
6e50: 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e  ster than callin
6e60: 67 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  g sqlite3StrICmp
6e70: 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75 74  () directly, but
6e80: 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61 72  .** produces lar
6e90: 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ger code..**.** 
6ea0: 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61  WARNING: This ma
6eb0: 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61  cro is not compa
6ec0: 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  tible with the s
6ed0: 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20  trcmp() family. 
6ee0: 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72  It.** returns tr
6ef0: 75 65 20 69 66 20 74 68 65 20 74 77 6f 20 73 74  ue if the two st
6f00: 72 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c 2c  rings are equal,
6f10: 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65   otherwise false
6f20: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 52  ..*/.#define STR
6f30: 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73 71  ICMP(x, y) (\.sq
6f40: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
6f50: 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  r[*(unsigned cha
6f60: 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73  r *)(x)]==   \.s
6f70: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
6f80: 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68  er[*(unsigned ch
6f90: 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a  ar *)(y)]     \.
6fa0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
6fb0: 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d  p((x)+1,(y)+1)==
6fc0: 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  0 )../*.** Add a
6fd0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
6fe0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
6ff0: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
7000: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
7010: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
7020: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
7030: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
7040: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
7050: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
7060: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
7070: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20  te3StartTable() 
7080: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
7090: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
70a0: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
70b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
70c0: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
70d0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
70e0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
70f0: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
7100: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
7110: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
7120: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
7130: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
7140: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
7150: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
7160: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  =0 ) return;.  z
7170: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
7180: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
7190: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
71a0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
71b0: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
71c0: 0a 20 20 20 20 69 66 28 20 53 54 52 49 43 4d 50  .    if( STRICMP
71d0: 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (z, p->aCol[i].z
71e0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
71f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7200: 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
7210: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  e column name: %
7220: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  s", z);.      sq
7230: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
7240: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
7250: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
7260: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
7270: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
7280: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
7290: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e  liteRealloc( p->
72a0: 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38  aCol, (p->nCol+8
72b0: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  )*sizeof(p->aCol
72c0: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
72d0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
72e0: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
72f0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
7300: 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d   }.    p->aCol =
7310: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
7320: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
7330: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
7340: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
7350: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
7360: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
7370: 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  . .  /* If there
7380: 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63   is no type spec
7390: 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68  ified, columns h
73a0: 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  ave the default 
73b0: 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e  affinity.  ** 'N
73c0: 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69  ONE'. If there i
73d0: 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69  s a type specifi
73e0: 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33  ed, then sqlite3
73f0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20  AddColumnType() 
7400: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c  will.  ** be cal
7410: 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20  led next to set 
7420: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63  pCol->affinity c
7430: 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  orrectly..  */. 
7440: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
7450: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
7460: 45 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a  E;.  p->nCol++;.
7470: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
7480: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
7490: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
74a0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
74b0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
74c0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
74d0: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
74e0: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
74f0: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
7500: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
7510: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
7520: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
7530: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
7540: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
7550: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
7560: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
7570: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  te3AddNotNull(Pa
7580: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
7590: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
75a0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
75b0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
75c0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
75d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
75e0: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
75f0: 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c  ( i>=0 ) p->aCol
7600: 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e  [i].notNull = on
7610: 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Error;.}../*.** 
7620: 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Scan the column 
7630: 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20  type name zType 
7640: 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61  (length nType) a
7650: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a  nd return the.**
7660: 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66 69   associated affi
7670: 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a  nity type..**.**
7680: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
7690: 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65  es a case-indepe
76a0: 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20  ndent search of 
76b0: 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a  zType for the .*
76c0: 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  * substrings in 
76d0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  the following ta
76e0: 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74  ble. If one of t
76f0: 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 73  he substrings is
7700: 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63  .** found, the c
7710: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66  orresponding aff
7720: 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e 65  inity is returne
7730: 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74  d. If zType cont
7740: 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61  ains.** more tha
7750: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62  n one of the sub
7760: 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73  strings, entries
7770: 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20   toward the top 
7780: 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  of .** the table
7790: 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20   take priority. 
77a0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
77b0: 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e  zType is 'BLOBIN
77c0: 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  T', .** SQLITE_A
77d0: 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65  FF_INTEGER is re
77e0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75  turned..**.** Su
77f0: 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66  bstring     | Af
7800: 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  finity.** ------
7810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49  ----------.** 'I
7830: 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53 51  NT'         | SQ
7840: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
7850: 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20 20  .** 'CHAR'      
7860: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
7870: 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20  EXT.** 'CLOB'   
7880: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7890: 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27  F_TEXT.** 'TEXT'
78a0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
78b0: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c  _AFF_TEXT.** 'BL
78c0: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
78d0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20  ITE_AFF_NONE.** 
78e0: 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20  'REAL'        | 
78f0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
7900: 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20  ** 'FLOA'       
7910: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
7920: 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20  AL.** 'DOUB'    
7930: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7940: 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  _REAL.**.** If n
7950: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
7960: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f  rings in the abo
7970: 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75  ve table are fou
7980: 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  nd,.** SQLITE_AF
7990: 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74  F_NUMERIC is ret
79a0: 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73  urned..*/.char s
79b0: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
79c0: 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a  pe(const Token *
79d0: 70 54 79 70 65 29 7b 0a 20 20 75 33 32 20 68 20  pType){.  u32 h 
79e0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20  = 0;.  char aff 
79f0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  = SQLITE_AFF_NUM
7a00: 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  ERIC;.  const un
7a10: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e  signed char *zIn
7a20: 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a 20 20 63   = pType->z;.  c
7a30: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
7a40: 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70 54 79 70  ar *zEnd = &pTyp
7a50: 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d 3b 0a  e->z[pType->n];.
7a60: 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d 7a  .  while( zIn!=z
7a70: 45 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d 20 28  End ){.    h = (
7a80: 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55  h<<8) + sqlite3U
7a90: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49 6e  pperToLower[*zIn
7aa0: 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20  ];.    zIn++;.  
7ab0: 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c    if( h==(('c'<<
7ac0: 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27  24)+('h'<<16)+('
7ad0: 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20  a'<<8)+'r') ){  
7ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48             /* CH
7af0: 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  AR */.      aff 
7b00: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
7b10: 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  T; .    }else if
7b20: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
7b30: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
7b40: 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20  8)+'b') ){      
7b50: 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20   /* CLOB */.    
7b60: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
7b70: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c  FF_TEXT;.    }el
7b80: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c  se if( h==(('t'<
7b90: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
7ba0: 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20  'x'<<8)+'t') ){ 
7bb0: 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f        /* TEXT */
7bc0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
7bd0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
7be0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
7bf0: 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('b'<<24)+('l'<<
7c00: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
7c10: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c  )          /* BL
7c20: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  OB */.        &&
7c30: 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46   (aff==SQLITE_AF
7c40: 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66  F_NUMERIC || aff
7c50: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
7c60: 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  L) ){.      aff 
7c70: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
7c80: 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  E;.#ifndef SQLIT
7c90: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
7ca0: 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20  POINT.    }else 
7cb0: 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34  if( h==(('r'<<24
7cc0: 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27  )+('e'<<16)+('a'
7cd0: 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20  <<8)+'l')       
7ce0: 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20     /* REAL */.  
7cf0: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
7d00: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
7d10: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
7d20: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
7d30: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
7d40: 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c  ==(('f'<<24)+('l
7d50: 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b  '<<16)+('o'<<8)+
7d60: 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'a')          /*
7d70: 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20   FLOA */.       
7d80: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
7d90: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
7da0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
7db0: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20  E_AFF_REAL;.    
7dc0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
7dd0: 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36  d'<<24)+('o'<<16
7de0: 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20  )+('u'<<8)+'b') 
7df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42           /* DOUB
7e00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
7e10: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
7e20: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
7e30: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7e40: 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20  _REAL;.#endif.  
7e50: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30    }else if( (h&0
7e60: 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69  x00FFFFFF)==(('i
7e70: 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b  '<<16)+('n'<<8)+
7e80: 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e  't') ){    /* IN
7e90: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
7ea0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
7eb0: 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  GER;.      break
7ec0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
7ed0: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
7ee0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7ef0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
7f00: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
7f10: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
7f20: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
7f30: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7f40: 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73 74  ent.  The pFirst
7f50: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69   token is the fi
7f60: 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20  rst.** token in 
7f70: 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20  the sequence of 
7f80: 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63  tokens that desc
7f90: 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f 66  ribe the type of
7fa0: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63   the.** column c
7fb0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
7fc0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70  onstruction.   p
7fd0: 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73 74  Last is the last
7fe0: 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65   token.** in the
7ff0: 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20   sequence.  Use 
8000: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
8010: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20   to construct a 
8020: 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63  string.** that c
8030: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70 65  ontains the type
8040: 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  name of the colu
8050: 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61  mn and store tha
8060: 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a  t string.** in z
8070: 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73  Type..*/ .void s
8080: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54  qlite3AddColumnT
8090: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
80a0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29  e, Token *pType)
80b0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
80c0: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
80d0: 2a 70 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 28 70  *pCol;..  if( (p
80e0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
80f0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
8100: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
8110: 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20  -1;.  if( i<0 ) 
8120: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
8130: 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20   &p->aCol[i];.  
8140: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
8150: 3e 7a 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d  >zType);.  pCol-
8160: 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  >zType = sqlite3
8170: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
8180: 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66  ype);.  pCol->af
8190: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
81a0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 54 79  AffinityType(pTy
81b0: 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pe);.}../*.** Th
81c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
81d0: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
81e0: 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  e for the most r
81f0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
8200: 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74  lumn.** of the t
8210: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
8220: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8230: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  n..**.** Default
8240: 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f   value expressio
8250: 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  ns must be const
8260: 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65  ant.  Raise an e
8270: 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73  xception if this
8280: 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63  .** is not the c
8290: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
82a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
82b0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
82c0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
82d0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
82e0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
82f0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
8300: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65  oid sqlite3AddDe
8310: 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65  faultValue(Parse
8320: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
8330: 70 45 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20  pExpr){.  Table 
8340: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
8350: 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  ol;.  if( (p = p
8360: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8370: 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  )!=0 ){.    pCol
8380: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e   = &(p->aCol[p->
8390: 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66  nCol-1]);.    if
83a0: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
83b0: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
83c0: 6f 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  on(pExpr) ){.   
83d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
83e0: 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61  sg(pParse, "defa
83f0: 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c  ult value of col
8400: 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20  umn [%s] is not 
8410: 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20  constant",.     
8420: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65       pCol->zName
8430: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8440: 20 20 20 20 45 78 70 72 20 2a 70 43 6f 70 79 3b      Expr *pCopy;
8450: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
8460: 70 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70  prDelete(pCol->p
8470: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f  Dflt);.      pCo
8480: 6c 2d 3e 70 44 66 6c 74 20 3d 20 70 43 6f 70 79  l->pDflt = pCopy
8490: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
84a0: 70 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  p(pExpr);.      
84b0: 69 66 28 20 70 43 6f 70 79 20 29 7b 0a 20 20 20  if( pCopy ){.   
84c0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65       sqlite3Toke
84d0: 6e 43 6f 70 79 28 26 70 43 6f 70 79 2d 3e 73 70  nCopy(&pCopy->sp
84e0: 61 6e 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e  an, &pExpr->span
84f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8500: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
8510: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b  prDelete(pExpr);
8520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e  .}../*.** Design
8530: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
8540: 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c  KEY for the tabl
8550: 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c  e.  pList is a l
8560: 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a  ist of names .**
8570: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
8580: 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72   form the primar
8590: 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74  y key.  If pList
85a0: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
85b0: 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
85c0: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
85d0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   of the table is
85e0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
85f0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20  ..**.** A table 
8600: 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74  can have at most
8610: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
8620: 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
8630: 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61  already has.** a
8640: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e   primary key (an
8650: 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  d this is the se
8660: 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79  cond primary key
8670: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e  ) then create an
8680: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  .** error..**.**
8690: 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   If the PRIMARY 
86a0: 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67  KEY is on a sing
86b0: 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20  le column whose 
86c0: 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45  datatype is INTE
86d0: 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20  GER,.** then we 
86e0: 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20  will try to use 
86f0: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74  that column as t
8700: 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74  he rowid.  Set t
8710: 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a  he Table.iPKey.*
8720: 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74  * field of the t
8730: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
8740: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68  ruction to be th
8750: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a  e index of the.*
8760: 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
8770: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54  Y KEY column.  T
8780: 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65  able.iPKey is se
8790: 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65  t to -1 if there
87a0: 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45   is.** no INTEGE
87b0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
87c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20  *.** If the key 
87d0: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
87e0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
87f0: 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69  hen create a uni
8800: 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72  que.** index for
8810: 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e   the key.  No in
8820: 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66  dex is created f
8830: 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  or INTEGER PRIMA
8840: 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64  RY KEYs..*/.void
8850: 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61   sqlite3AddPrima
8860: 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  ryKey(.  Parse *
8870: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
8880: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
8890: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
88a0: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
88b0: 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62  field names to b
88c0: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
88d0: 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
88e0: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
88f0: 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73  ith a uniqueness
8900: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69   conflict */.  i
8910: 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20  nt autoInc,     
8920: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
8930: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65  AUTOINCREMENT ke
8940: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
8950: 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
8960: 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54  der     /* SQLIT
8970: 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49  E_SO_ASC or SQLI
8980: 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b  TE_SO_DESC */.){
8990: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
89a0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
89b0: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  le;.  char *zTyp
89c0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  e = 0;.  int iCo
89d0: 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28  l = -1, i;.  if(
89e0: 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44   pTab==0 || IN_D
89f0: 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f  ECLARE_VTAB ) go
8a00: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
8a10: 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  xit;.  if( pTab-
8a20: 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20  >hasPrimKey ){. 
8a30: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8a40: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
8a50: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
8a60: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
8a70: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
8a80: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
8a90: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
8aa0: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
8ab0: 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20  Tab->hasPrimKey 
8ac0: 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 1;.  if( pList
8ad0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  ==0 ){.    iCol 
8ae0: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31  = pTab->nCol - 1
8af0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c  ;.    pTab->aCol
8b00: 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79  [iCol].isPrimKey
8b10: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
8b20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
8b30: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
8b40: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c  {.      for(iCol
8b50: 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
8b60: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
8b70: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8b80: 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
8b90: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
8ba0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
8bb0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
8bc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8bd0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8be0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62     if( iCol<pTab
8bf0: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
8c00: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
8c10: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
8c20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8c30: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e      if( pList->n
8c40: 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20  Expr>1 ) iCol = 
8c50: 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  -1;.  }.  if( iC
8c60: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
8c70: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
8c80: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
8c90: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
8ca0: 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20    }.  if( zType 
8cb0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
8cc0: 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45  p(zType, "INTEGE
8cd0: 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26  R")==0.        &
8ce0: 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c  & sortOrder==SQL
8cf0: 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20  ITE_SO_ASC ){.  
8d00: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
8d10: 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e  iCol;.    pTab->
8d20: 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f  keyConf = onErro
8d30: 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 75 74  r;.    pTab->aut
8d40: 6f 49 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a  oInc = autoInc;.
8d50: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f    }else if( auto
8d60: 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  Inc ){.#ifndef S
8d70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
8d80: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c  NCREMENT.    sql
8d90: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8da0: 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d  rse, "AUTOINCREM
8db0: 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  ENT is only allo
8dc0: 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20  wed on an ".    
8dd0: 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d     "INTEGER PRIM
8de0: 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69  ARY KEY");.#endi
8df0: 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  f.  }else{.    s
8e00: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
8e10: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
8e20: 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f  0, pList, onErro
8e30: 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72 64  r, 0, 0, sortOrd
8e40: 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73  er, 0);.    pLis
8e50: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d  t = 0;.  }..prim
8e60: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20  ary_key_exit:.  
8e70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8e80: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
8e90: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
8ea0: 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b   Add a new CHECK
8eb0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74   constraint to t
8ec0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
8ed0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
8ee0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
8ef0: 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f  qlite3AddCheckCo
8f00: 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
8f10: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
8f20: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8f30: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65   */.  Expr *pChe
8f40: 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63  ckExpr  /* The c
8f50: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20  heck expression 
8f60: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
8f70: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
8f80: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
8f90: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8fa0: 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26  e;.  if( pTab &&
8fb0: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
8fc0: 42 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  B ){.    /* The 
8fd0: 43 48 45 43 4b 20 65 78 70 72 65 73 73 69 6f 6e  CHECK expression
8fe0: 20 6d 75 73 74 20 62 65 20 64 75 70 6c 69 63 61   must be duplica
8ff0: 74 65 64 20 73 6f 20 74 68 61 74 20 74 6f 6b 65  ted so that toke
9000: 6e 73 20 72 65 66 65 72 0a 20 20 20 20 2a 2a 20  ns refer.    ** 
9010: 74 6f 20 6d 61 6c 6c 6f 63 65 64 20 73 70 61 63  to malloced spac
9020: 65 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 28 65  e and not the (e
9030: 70 68 65 6d 65 72 61 6c 29 20 74 65 78 74 20 6f  phemeral) text o
9040: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
9050: 4c 45 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  LE.    ** statem
9060: 65 6e 74 20 2a 2f 0a 20 20 20 20 70 54 61 62 2d  ent */.    pTab-
9070: 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  >pCheck = sqlite
9080: 33 45 78 70 72 41 6e 64 28 70 54 61 62 2d 3e 70  3ExprAnd(pTab->p
9090: 43 68 65 63 6b 2c 20 73 71 6c 69 74 65 33 45 78  Check, sqlite3Ex
90a0: 70 72 44 75 70 28 70 43 68 65 63 6b 45 78 70 72  prDup(pCheckExpr
90b0: 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ));.  }.#endif. 
90c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
90d0: 74 65 28 70 43 68 65 63 6b 45 78 70 72 29 3b 0a  te(pCheckExpr);.
90e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
90f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
9100: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
9110: 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20  recently parsed 
9120: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  table column.** 
9130: 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67  to the CollSeq g
9140: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
9150: 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54  lite3AddCollateT
9160: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
9170: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
9180: 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29  Type, int nType)
9190: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
91a0: 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 28 70  int i;..  if( (p
91b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
91c0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
91d0: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
91e0: 2d 31 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  -1;..  if( sqlit
91f0: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
9200: 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 6e  pParse, zType, n
9210: 54 79 70 65 29 20 29 7b 0a 20 20 20 20 49 6e 64  Type) ){.    Ind
9220: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 70 2d  ex *pIdx;.    p-
9230: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d  >aCol[i].zColl =
9240: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 7a   sqliteStrNDup(z
9250: 54 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20  Type, nType);.  
9260: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
9270: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
9280: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
9290: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
92a0: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a   <type>",.    **
92b0: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
92c0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
92d0: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
92e0: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
92f0: 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
9300: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
9310: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
9320: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
9330: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
9340: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
9350: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
9360: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
9370: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
9380: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
9390: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
93a0: 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20  mn[0]==i ){.    
93b0: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
93c0: 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d  [0] = p->aCol[i]
93d0: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  .zColl;.      }.
93e0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
93f0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9400: 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c   returns the col
9410: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
9420: 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74  for database nat
9430: 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f  ive text.** enco
9440: 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20  ding identified 
9450: 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e  by the string zN
9460: 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d  ame, length nNam
9470: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
9480: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
9490: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
94a0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  not available, o
94b0: 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a  r not available.
94c0: 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
94d0: 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69  se native encodi
94e0: 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ng, the collatio
94f0: 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76  n factory is inv
9500: 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65  oked to.** reque
9510: 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f  st it. If the co
9520: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
9530: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20  does not supply 
9540: 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c  such a sequence,
9550: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75  .** and the sequ
9560: 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  ence is availabl
9570: 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78  e in another tex
9580: 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e  t encoding, then
9590: 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75   that is.** retu
95a0: 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  rned instead..**
95b0: 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f  .** If no versio
95c0: 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  ns of the reques
95d0: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73  ted collations s
95e0: 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69  equence are avai
95f0: 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f  lable, or.** ano
9600: 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
9610: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
9620: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
9630: 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e   message written
9640: 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e   into.** pParse.
9650: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9660: 69 6e 65 20 69 73 20 61 20 77 72 61 70 70 65 72  ine is a wrapper
9670: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46   around sqlite3F
9680: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54  indCollSeq().  T
9690: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
96a0: 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61  nvokes the colla
96b0: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20  tion factory if 
96c0: 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74  the named collat
96d0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ion cannot be fo
96e0: 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  und.** and gener
96f0: 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ates an error me
9700: 73 73 61 67 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65  ssage..*/.CollSe
9710: 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  q *sqlite3Locate
9720: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
9730: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
9740: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e  r *zName, int nN
9750: 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ame){.  sqlite3 
9760: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9770: 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43  ;.  u8 enc = ENC
9780: 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62  (db);.  u8 initb
9790: 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62  usy = db->init.b
97a0: 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  usy;.  CollSeq *
97b0: 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20  pColl;..  pColl 
97c0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
97d0: 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e  lSeq(db, enc, zN
97e0: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74  ame, nName, init
97f0: 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e  busy);.  if( !in
9800: 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c  itbusy && (!pCol
9810: 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d  l || !pColl->xCm
9820: 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  p) ){.    pColl 
9830: 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
9840: 53 65 71 28 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a  Seq(db, pColl, z
9850: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
9860: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
9870: 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3c        if( nName<
9880: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e 61  0 ){.        nNa
9890: 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  me = strlen(zNam
98a0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
98b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
98c0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
98d0: 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ch collation seq
98e0: 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e  uence: %.*s", nN
98f0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ame, zName);.   
9900: 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20     pColl = 0;.  
9910: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
9920: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pColl;.}.../*.
9930: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
9940: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
9950: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
9960: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
9970: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
9980: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
9990: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
99a0: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
99b0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
99c0: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
99d0: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
99e0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
99f0: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
9a00: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
9a10: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
9a20: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
9a30: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
9a40: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
9a50: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
9a60: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
9a70: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
9a80: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
9a90: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
9aa0: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
9ab0: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
9ac0: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
9ad0: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
9ae0: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
9af0: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
9b00: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
9b10: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
9b20: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
9b30: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
9b40: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
9b50: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
9b60: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
9b70: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
9b80: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
9b90: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
9ba0: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
9bb0: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
9bc0: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
9bd0: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
9be0: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
9bf0: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
9c00: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
9c10: 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33 20 2a  Cookie(sqlite3 *
9c20: 64 62 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e 74  db, Vdbe *v, int
9c30: 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   iDb){.  sqlite3
9c40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9c50: 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62  Integer, db->aDb
9c60: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
9c70: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20  chema_cookie+1, 
9c80: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
9c90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
9ca0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b  Cookie, iDb, 0);
9cb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
9cc0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
9cd0: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
9ce0: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
9cf0: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
9d00: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
9d10: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
9d20: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
9d30: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
9d40: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
9d50: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
9d60: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
9d70: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
9d80: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
9d90: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
9da0: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
9db0: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
9dc0: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
9dd0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
9de0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
9df0: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
9e00: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
9e10: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
9e20: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
9e30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
9e40: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f   an identifier o
9e50: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
9e60: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e  he given string.
9e70: 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63    Add.** quote c
9e80: 68 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65  haracters as nee
9e90: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ded..*/.static v
9ea0: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
9eb0: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
9ec0: 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64   char *zSignedId
9ed0: 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ent){.  unsigned
9ee0: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20   char *zIdent = 
9ef0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
9f00: 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20  zSignedIdent;.  
9f10: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
9f20: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
9f30: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
9f40: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
9f50: 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a    if( !isalnum(z
9f60: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
9f70: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
9f80: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
9f90: 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a  uote =  zIdent[j
9fa0: 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28  ]!=0 || isdigit(
9fb0: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
9fd0: 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f  sqlite3KeywordCo
9fe0: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
9ff0: 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64  K_ID;.  if( need
a000: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
a010: 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b   '"';.  for(j=0;
a020: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
a030: 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a  {.    z[i++] = z
a040: 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66  Ident[j];.    if
a050: 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27  ( zIdent[j]=='"'
a060: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
a070: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
a080: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
a090: 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b  '"';.  z[i] = 0;
a0a0: 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a  .  *pIdx = i;.}.
a0b0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
a0c0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
a0d0: 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72  tatement appropr
a0e0: 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76  iate for the giv
a0f0: 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65  en.** table.  Me
a100: 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
a110: 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61   text of the sta
a120: 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e  tement is obtain
a130: 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ed.** from sqlit
a140: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
a150: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
a160: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
a170: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ion..*/.static c
a180: 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65  har *createTable
a190: 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 2c 20 69  Stmt(Table *p, i
a1a0: 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20 20 69 6e  nt isTemp){.  in
a1b0: 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61  t i, k, n;.  cha
a1c0: 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72  r *zStmt;.  char
a1d0: 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20   *zSep, *zSep2, 
a1e0: 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c  *zEnd, *z;.  Col
a1f0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d  umn *pCol;.  n =
a200: 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d   0;.  for(pCol =
a210: 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69   p->aCol, i=0; i
a220: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
a230: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d  Col++){.    n +=
a240: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f   identLength(pCo
a250: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a  l->zName);.    z
a260: 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a   = pCol->zType;.
a270: 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20      if( z ){.   
a280: 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28     n += (strlen(
a290: 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20  z) + 1);.    }. 
a2a0: 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c   }.  n += identL
a2b0: 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b  ength(p->zName);
a2c0: 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20  .  if( n<50 ){. 
a2d0: 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20     zSep = "";.  
a2e0: 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20    zSep2 = ",";. 
a2f0: 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20     zEnd = ")";. 
a300: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70   }else{.    zSep
a310: 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a   = "\n  ";.    z
a320: 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a  Sep2 = ",\n  ";.
a330: 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22      zEnd = "\n)"
a340: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20  ;.  }.  n += 35 
a350: 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a  + 6*p->nCol;.  z
a360: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Stmt = sqliteMal
a370: 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69  locRaw( n );.  i
a380: 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65  f( zStmt==0 ) re
a390: 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79  turn 0;.  strcpy
a3a0: 28 7a 53 74 6d 74 2c 20 21 4f 4d 49 54 5f 54 45  (zStmt, !OMIT_TE
a3b0: 4d 50 44 42 26 26 69 73 54 65 6d 70 20 3f 20 22  MPDB&&isTemp ? "
a3c0: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
a3d0: 45 20 22 3a 22 43 52 45 41 54 45 20 54 41 42 4c  E ":"CREATE TABL
a3e0: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c  E ");.  k = strl
a3f0: 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65  en(zStmt);.  ide
a400: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
a410: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53   p->zName);.  zS
a420: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a  tmt[k++] = '(';.
a430: 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43    for(pCol=p->aC
a440: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
a450: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
a460: 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 53  {.    strcpy(&zS
a470: 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20  tmt[k], zSep);. 
a480: 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26     k += strlen(&
a490: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
a4a0: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
a4b0: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
a4c0: 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65   &k, pCol->zName
a4d0: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 20 3d 20  );.    if( (z = 
a4e0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20  pCol->zType)!=0 
a4f0: 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b  ){.      zStmt[k
a500: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
a510: 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b   strcpy(&zStmt[k
a520: 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b  ], z);.      k +
a530: 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20  = strlen(z);.   
a540: 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28   }.  }.  strcpy(
a550: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29  &zStmt[k], zEnd)
a560: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74  ;.  return zStmt
a570: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
a580: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a590: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20  d to report the 
a5a0: 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74  final ")" that t
a5b0: 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43  erminates.** a C
a5c0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
a5d0: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
a5e0: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
a5f0: 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69   that other acti
a600: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  on routines have
a610: 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a   been building.*
a620: 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
a630: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
a640: 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67  tables, assuming
a650: 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a   no errors have.
a660: 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a  ** occurred..**.
a670: 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20  ** An entry for 
a680: 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64  the table is mad
a690: 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  e in the master 
a6a0: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75  table on disk, u
a6b0: 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73  nless.** this is
a6c0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
a6d0: 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62  le or db->init.b
a6e0: 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62  usy==1.  When db
a6f0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a  ->init.busy==1.*
a700: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
a710: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
a720: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
a730: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
a740: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
a750: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
a760: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
a770: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
a780: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
a790: 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68  y changed, so th
a7a0: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
a7b0: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
a7c0: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
a7d0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
a7e0: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
a7f0: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
a800: 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
a810: 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
a820: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
a830: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
a840: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
a850: 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
a860: 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
a870: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
a880: 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
a890: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
a8a0: 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
a8b0: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
a8c0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
a8d0: 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
a8e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
a8f0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
a900: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
a910: 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  dTable(.  Parse 
a920: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
a930: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
a940: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
a950: 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20  Cons,           
a960: 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e  /* The ',' token
a970: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
a980: 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a  column defn. */.
a990: 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
a9a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a9b0: 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e   final ')' token
a9c0: 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
a9d0: 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ABLE */.  Select
a9e0: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
a9f0: 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d    /* Select from
aa00: 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41   a "CREATE ... A
aa10: 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a  S SELECT" */.){.
aa20: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
aa30: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
aa40: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
aa50: 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d  b;..  if( (pEnd=
aa60: 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30  =0 && pSelect==0
aa70: 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  ) || pParse->nEr
aa80: 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c  r || sqlite3Mall
aa90: 6f 63 46 61 69 6c 65 64 28 29 20 29 20 7b 0a 20  ocFailed() ) {. 
aaa0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
aab0: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
aac0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
aad0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
aae0: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
aaf0: 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65  t.busy || !pSele
ab00: 63 74 20 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73  ct );..  iDb = s
ab10: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
ab20: 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65  dex(db, p->pSche
ab30: 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
ab40: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
ab50: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d    /* Resolve nam
ab60: 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20  es in all CHECK 
ab70: 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65  constraint expre
ab80: 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ssions..  */.  i
ab90: 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a  f( p->pCheck ){.
aba0: 20 20 20 20 53 72 63 4c 69 73 74 20 73 53 72 63      SrcList sSrc
abb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
abc0: 20 20 20 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c      /* Fake SrcL
abd0: 69 73 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e  ist for pParse->
abe0: 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20 20  pNewTable */.   
abf0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
ac00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ac10: 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
ac20: 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65   for pParse->pNe
ac30: 77 54 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6d  wTable */..    m
ac40: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
ac50: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
ac60: 20 6d 65 6d 73 65 74 28 26 73 53 72 63 2c 20 30   memset(&sSrc, 0
ac70: 2c 20 73 69 7a 65 6f 66 28 73 53 72 63 29 29 3b  , sizeof(sSrc));
ac80: 0a 20 20 20 20 73 53 72 63 2e 6e 53 72 63 20 3d  .    sSrc.nSrc =
ac90: 20 31 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30   1;.    sSrc.a[0
aca0: 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61  ].zName = p->zNa
acb0: 6d 65 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30  me;.    sSrc.a[0
acc0: 5d 2e 70 54 61 62 20 3d 20 70 3b 0a 20 20 20 20  ].pTab = p;.    
acd0: 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f  sSrc.a[0].iCurso
ace0: 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 4e 43 2e  r = -1;.    sNC.
acf0: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
ad00: 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
ad10: 74 20 3d 20 26 73 53 72 63 3b 0a 20 20 20 20 73  t = &sSrc;.    s
ad20: 4e 43 2e 69 73 43 68 65 63 6b 20 3d 20 31 3b 0a  NC.isCheck = 1;.
ad30: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
ad40: 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
ad50: 26 73 4e 43 2c 20 70 2d 3e 70 43 68 65 63 6b 29  &sNC, p->pCheck)
ad60: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
ad70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
ad80: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
ad90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
ada0: 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) */..  /* If th
adb0: 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
adc0: 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65  is 1 it means we
add0: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
ade0: 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a   SQL off the.  *
adf0: 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  * "sqlite_master
ae00: 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d  " or "sqlite_tem
ae10: 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  p_master" table 
ae20: 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a  on the disk..  *
ae30: 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74  * So do not writ
ae40: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67  e to the disk ag
ae50: 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68  ain.  Extract th
ae60: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
ae70: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
ae80: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64  table from the d
ae90: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20  b->init.newTnum 
aea0: 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67  field.  (The pag
aeb0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68  e number.  ** sh
aec0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
aed0: 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20  ut there by the 
aee0: 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75  sqliteOpenCb rou
aef0: 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  tine.).  */.  if
af00: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
af10: 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d  ){.    p->tnum =
af20: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
af30: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
af40: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
af50: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
af60: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
af70: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
af80: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
af90: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
afa0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72  database.  The r
afb0: 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a  ecord number.  *
afc0: 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  * for the new ta
afd0: 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64  ble entry should
afe0: 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74   already be on t
aff0: 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20  he stack..  **. 
b000: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
b010: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
b020: 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72  , write the entr
b030: 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c  y into the auxil
b040: 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69  iary.  ** file i
b050: 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74  nstead of into t
b060: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
b070: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
b080: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
b090: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
b0a0: 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
b0b0: 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20  char *zType;    
b0c0: 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61  /* "view" or "ta
b0d0: 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  ble" */.    char
b0e0: 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22   *zType2;   /* "
b0f0: 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22  VIEW" or "TABLE"
b100: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
b110: 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20  tmt;    /* Text 
b120: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
b130: 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49  BLE or CREATE VI
b140: 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EW statement */.
b150: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
b160: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
b170: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
b180: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c  return;..    sql
b190: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b1a0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
b1b0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
b1c0: 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f   the rootpage fo
b1d0: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
b1e0: 61 6e 64 20 70 75 73 68 20 69 74 20 6f 6e 74 6f  and push it onto
b1f0: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
b200: 2a 2a 20 41 20 76 69 65 77 20 68 61 73 20 6e 6f  ** A view has no
b210: 20 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20 6a 75   rootpage, so ju
b220: 73 74 20 70 75 73 68 20 61 20 7a 65 72 6f 20 6f  st push a zero o
b230: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 66 6f  nto the stack fo
b240: 72 0a 20 20 20 20 2a 2a 20 76 69 65 77 73 2e 20  r.    ** views. 
b250: 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70   Initialize zTyp
b260: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
b270: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  me..    */.    i
b280: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
b290: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72   ){.      /* A r
b2a0: 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a  egular table */.
b2b0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74        zType = "t
b2c0: 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79  able";.      zTy
b2d0: 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23  pe2 = "TABLE";.#
b2e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b2f0: 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73  IT_VIEW.    }els
b300: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69  e{.      /* A vi
b310: 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70  ew */.      zTyp
b320: 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20  e = "view";.    
b330: 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57    zType2 = "VIEW
b340: 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  ";.#endif.    }.
b350: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
b360: 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  is a CREATE TABL
b370: 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e  E xx AS SELECT .
b380: 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20  .., execute the 
b390: 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74  SELECT.    ** st
b3a0: 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c  atement to popul
b3b0: 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ate the new tabl
b3c0: 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65  e. The root-page
b3d0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a   number for the.
b3e0: 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65      ** new table
b3f0: 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f   is on the top o
b400: 66 20 74 68 65 20 76 64 62 65 20 73 74 61 63 6b  f the vdbe stack
b410: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
b420: 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20  Once the SELECT 
b430: 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62  has been coded b
b440: 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  y sqlite3Select(
b450: 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20  ), it is in a.  
b460: 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74    ** suitable st
b470: 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ate to query for
b480: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
b490: 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62  s and types to b
b4a0: 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79  e used.    ** by
b4b0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
b4c0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20      **.    ** A 
b4d0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69  shared-cache wri
b4e0: 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  te-lock is not r
b4f0: 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65  equired to write
b500: 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c   to the new tabl
b510: 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73  e,.    ** as a s
b520: 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20  chema-lock must 
b530: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
b540: 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72  n obtained to cr
b550: 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20  eate it. Since. 
b560: 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c     ** a schema-l
b570: 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c  ock excludes all
b580: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
b590: 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65  users, the write
b5a0: 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20  -lock would.    
b5b0: 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e  ** be redundant.
b5c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
b5d0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
b5e0: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
b5f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b600: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
b610: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
b620: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b630: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
b640: 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  iDb, 0);.      s
b650: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b660: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
b670: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50   1, 0);.      pP
b680: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a  arse->nTab = 2;.
b690: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
b6a0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
b6b0: 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20  ect, SRT_Table, 
b6c0: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
b6d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b6e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
b6f0: 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  se, 1, 0);.     
b700: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
b710: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
b720: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
b730: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
b740: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
b750: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
b760: 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
b770: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
b780: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
b790: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
b7a0: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
b7b0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->nCol;.        
b7c0: 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->aCol = pSelTa
b7d0: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->aCol;.       
b7e0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
b7f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   0;.        pSel
b800: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
b810: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
b820: 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c 54 61  leteTable(pSelTa
b830: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
b840: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  }..    /* Comput
b850: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  e the complete t
b860: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
b870: 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
b880: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
b890: 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  {.      zStmt = 
b8a0: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
b8b0: 70 2c 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  p, p->pSchema==p
b8c0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31  Parse->db->aDb[1
b8d0: 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ].pSchema);.    
b8e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d  }else{.      n =
b8f0: 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 50 61 72 73   pEnd->z - pPars
b900: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 20  e->sNameToken.z 
b910: 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74  + 1;.      zStmt
b920: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
b930: 66 28 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a  f("CREATE %s %.*
b940: 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70  s", zType2, n, p
b950: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
b960: 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n.z);.    }..   
b970: 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74   /* A slot for t
b980: 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c  he record has al
b990: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
b9a0: 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20  ated in the .   
b9b0: 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45   ** SQLITE_MASTE
b9c0: 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73  R table.  We jus
b9d0: 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65  t need to update
b9e0: 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20   that slot with 
b9f0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69  all.    ** the i
ba00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65  nformation we've
ba10: 20 63 6f 6c 6c 65 63 74 65 64 2e 20 20 54 68 65   collected.  The
ba20: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 70   rowid for the p
ba30: 72 65 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  reallocated.    
ba40: 2a 2a 20 73 6c 6f 74 20 69 73 20 74 68 65 20 32  ** slot is the 2
ba50: 6e 64 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  nd item on the s
ba60: 74 61 63 6b 2e 20 20 54 68 65 20 74 6f 70 20 6f  tack.  The top o
ba70: 66 20 74 68 65 20 73 74 61 63 6b 20 69 73 20 74  f the stack is t
ba80: 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70  he.    ** root p
ba90: 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  age for the new 
baa0: 74 61 62 6c 65 20 28 6f 72 20 61 20 30 20 69 66  table (or a 0 if
bab0: 20 74 68 69 73 20 69 73 20 61 20 76 69 65 77 29   this is a view)
bac0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
bad0: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
bae0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55  pParse,.      "U
baf0: 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20  PDATE %Q.%s ".  
bb00: 20 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65         "SET type
bb10: 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20  ='%s', name=%Q, 
bb20: 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f  tbl_name=%Q, roo
bb30: 74 70 61 67 65 3d 23 30 2c 20 73 71 6c 3d 25 51  tpage=#0, sql=%Q
bb40: 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
bb50: 20 72 6f 77 69 64 3d 23 31 22 2c 0a 20 20 20 20   rowid=#1",.    
bb60: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
bb70: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
bb80: 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 7a  LE(iDb),.      z
bb90: 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Type,.      p->z
bba0: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Name,.      p->z
bbb0: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 7a 53 74 6d  Name,.      zStm
bbc0: 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  t.    );.    sql
bbd0: 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a  iteFree(zStmt);.
bbe0: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
bbf0: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69  eCookie(db, v, i
bc00: 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
bc10: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
bc20: 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43  CREMENT.    /* C
bc30: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
bc40: 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  e need to create
bc50: 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65   an sqlite_seque
bc60: 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20  nce table for.  
bc70: 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61    ** keeping tra
bc80: 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d  ck of autoincrem
bc90: 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f  ent keys..    */
bca0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 75 74 6f  .    if( p->auto
bcb0: 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 44 62 20  Inc ){.      Db 
bcc0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
bcd0: 69 44 62 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  iDb];.      if( 
bce0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53  pDb->pSchema->pS
bcf0: 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  eqTab==0 ){.    
bd00: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
bd10: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
bd20: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
bd30: 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65   TABLE %Q.sqlite
bd40: 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73  _sequence(name,s
bd50: 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  eq)",.          
bd60: 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  pDb->zName.     
bd70: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
bd80: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
bd90: 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79  /* Reparse every
bda0: 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20  thing to update 
bdb0: 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74  our internal dat
bdc0: 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  a structures */.
bdd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
bde0: 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63  p3(v, OP_ParseSc
bdf0: 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20  hema, iDb, 0,.  
be00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
be10: 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d 65 3d 27  intf("tbl_name='
be20: 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20  %q'",p->zName), 
be30: 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P3_DYNAMIC);.  }
be40: 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  ...  /* Add the 
be50: 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d  table to the in-
be60: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
be70: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
be80: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
be90: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
bea0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
beb0: 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
bec0: 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20  *pOld;.    FKey 
bed0: 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 53 63 68  *pFKey; .    Sch
bee0: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70  ema *pSchema = p
bef0: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
bf00: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
bf10: 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61  hInsert(&pSchema
bf20: 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->tblHash, p->zN
bf30: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  ame, strlen(p->z
bf40: 4e 61 6d 65 29 2b 31 2c 70 29 3b 0a 20 20 20 20  Name)+1,p);.    
bf50: 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
bf60: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
bf70: 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
bf80: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
bf90: 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
bfa0: 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 72 65  rt() */.      re
bfb0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  turn;.    }.#ifn
bfc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bfd0: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20  FOREIGN_KEY.    
bfe0: 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b  for(pFKey=p->pFK
bff0: 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79  ey; pFKey; pFKey
c000: 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f  =pFKey->pNextFro
c010: 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  m){.      int nT
c020: 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65 79  o = strlen(pFKey
c030: 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20  ->zTo) + 1;.    
c040: 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
c050: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
c060: 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b  nd(&pSchema->aFK
c070: 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  ey, pFKey->zTo, 
c080: 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nTo);.      sqli
c090: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
c0a0: 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70  Schema->aFKey, p
c0b0: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20  FKey->zTo, nTo, 
c0c0: 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 23 65  pFKey);.    }.#e
c0d0: 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73 65 2d  ndif.    pParse-
c0e0: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
c0f0: 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b      db->nTable++
c100: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
c110: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
c120: 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65  Changes;..#ifnde
c130: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
c140: 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28  TERTABLE.    if(
c150: 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a   !p->pSelect ){.
c160: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
c170: 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
c180: 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e   char *)pParse->
c190: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20  sNameToken.z;.  
c1a0: 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20      int nName;. 
c1b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
c1c0: 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26  elect && pCons &
c1d0: 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  & pEnd );.      
c1e0: 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20  if( pCons->z==0 
c1f0: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73  ){.        pCons
c200: 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d   = pEnd;.      }
c210: 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28  .      nName = (
c220: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f  const char *)pCo
c230: 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 3b 0a 20  ns->z - zName;. 
c240: 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66       p->addColOf
c250: 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69  fset = 13 + sqli
c260: 74 65 33 75 74 66 38 43 68 61 72 4c 65 6e 28 7a  te3utf8CharLen(z
c270: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
c280: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
c290: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c2a0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
c2b0: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
c2c0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
c2d0: 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74  n order to creat
c2e0: 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a  e a new VIEW.*/.
c2f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
c300: 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20  teView(.  Parse 
c310: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
c320: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
c330: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
c340: 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54  pBegin,     /* T
c350: 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
c360: 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20  that begins the 
c370: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
c380: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
c390: 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
c3a0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
c3b0: 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
c3c0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
c3d0: 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  2,     /* The to
c3e0: 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
c3f0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
c400: 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  iew */.  Select 
c410: 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41  *pSelect,   /* A
c420: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c430: 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  t that will beco
c440: 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  me the new view 
c450: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
c460: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
c470: 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20  for a TEMPORARY 
c480: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  view */.  int no
c490: 45 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Err          /* 
c4a0: 53 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d  Suppress error m
c4b0: 65 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20  essages if VIEW 
c4c0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
c4d0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
c4e0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
c4f0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
c500: 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64  *z;.  Token sEnd
c510: 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  ;.  DbFixer sFix
c520: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  ;.  Token *pName
c530: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
c540: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  if( pParse->nVar
c550: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
c560: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c570: 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72  , "parameters ar
c580: 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e  e not allowed in
c590: 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71   views");.    sq
c5a0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
c5b0: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  e(pSelect);.    
c5c0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
c5d0: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
c5e0: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
c5f0: 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20  pName2, isTemp, 
c600: 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20  1, 0, noErr);.  
c610: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
c620: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
c630: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
c640: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
c650: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
c660: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
c670: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
c680: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
c690: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
c6a0: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
c6b0: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
c6c0: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
c6d0: 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  ->db, p->pSchema
c6e0: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
c6f0: 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
c700: 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65  Parse, iDb, "vie
c710: 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26  w", pName).    &
c720: 26 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65  & sqlite3FixSele
c730: 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63  ct(&sFix, pSelec
c740: 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  t).  ){.    sqli
c750: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
c760: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
c770: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
c780: 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  Make a copy of t
c790: 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54  he entire SELECT
c7a0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
c7b0: 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
c7c0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c  ..  ** This will
c7d0: 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45   force all the E
c7e0: 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75  xpr.token.z valu
c7f0: 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  es to be dynamic
c800: 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  ally.  ** alloca
c810: 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20  ted rather than 
c820: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70  point to the inp
c830: 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63  ut string - whic
c840: 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a  h means that.  *
c850: 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73  * they will pers
c860: 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63 75  ist after the cu
c870: 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  rrent sqlite3_ex
c880: 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ec() call return
c890: 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65  s..  */.  p->pSe
c8a0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
c8b0: 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63 74 29  lectDup(pSelect)
c8c0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
c8d0: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
c8e0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d  ;.  if( sqlite3M
c8f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b  allocFailed() ){
c900: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
c910: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
c920: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
c930: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69 65 77  .    sqlite3View
c940: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
c950: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a  Parse, p);.  }..
c960: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
c970: 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
c980: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
c990: 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69  .  Make sEnd poi
c9a0: 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  nt to.  ** the e
c9b0: 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20  nd..  */.  sEnd 
c9c0: 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  = pParse->sLastT
c9d0: 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64  oken;.  if( sEnd
c9e0: 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64  .z[0]!=0 && sEnd
c9f0: 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20  .z[0]!=';' ){.  
ca00: 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64    sEnd.z += sEnd
ca10: 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e  .n;.  }.  sEnd.n
ca20: 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e 64   = 0;.  n = sEnd
ca30: 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a  .z - pBegin->z;.
ca40: 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73    z = (const uns
ca50: 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 65 67  igned char*)pBeg
ca60: 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
ca70: 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d  n>0 && (z[n-1]==
ca80: 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a  ';' || isspace(z
ca90: 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20  [n-1])) ){ n--; 
caa0: 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b  }.  sEnd.z = &z[
cab0: 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d  n-1];.  sEnd.n =
cac0: 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71   1;..  /* Use sq
cad0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
cae0: 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20  to add the view 
caf0: 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  to the SQLITE_MA
cb00: 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20  STER table */.  
cb10: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
cb20: 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64  pParse, 0, &sEnd
cb30: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  , 0);.  return;.
cb40: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
cb50: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
cb60: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
cb70: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
cb80: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
cb90: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
cba0: 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ABLE)./*.** The 
cbb0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
cbc0: 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79  pTable is really
cbd0: 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69   a VIEW.  Fill i
cbe0: 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a  n the names of.*
cbf0: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  * the columns of
cc00: 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65   the view in the
cc10: 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72   pTable structur
cc20: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
cc30: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f  umber.** of erro
cc40: 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  rs.  If an error
cc50: 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61   is seen leave a
cc60: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
cc70: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
cc80: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
cc90: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
cca0: 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ames(Parse *pPar
ccb0: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  se, Table *pTabl
ccc0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65  e){.  Table *pSe
ccd0: 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b  lTab;   /* A fak
cce0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69  e table from whi
ccf0: 63 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65  ch we get the re
cd00: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65  sult set */.  Se
cd10: 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20  lect *pSel;     
cd20: 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53  /* Copy of the S
cd30: 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65  ELECT that imple
cd40: 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a  ments the view *
cd50: 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  /.  int nErr = 0
cd60: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
cd70: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
cd80: 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  tered */.  int n
cd90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
cda0: 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64  Temporarily hold
cdb0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
cdc0: 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64  cursors assigned
cdd0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
cde0: 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65  Table );..#ifnde
cdf0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
ce00: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
ce10: 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
ce20: 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20  Connect(pParse, 
ce30: 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72  pTable) ){.    r
ce40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
ce50: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73  OR;.  }.  if( Is
ce60: 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20  Virtual(pTable) 
ce70: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
ce80: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
ce90: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
cea0: 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f  * A positive nCo
ceb0: 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75  l means the colu
cec0: 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  mns names for th
ced0: 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a  is view are.  **
cee0: 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a   already known..
cef0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
cf00: 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75  e->nCol>0 ) retu
cf10: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65  rn 0;..  /* A ne
cf20: 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61  gative nCol is a
cf30: 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20   special marker 
cf40: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20  meaning that we 
cf50: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
cf60: 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d  ** trying to com
cf70: 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
cf80: 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e  names.  If we en
cf90: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
cfa0: 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67   with.  ** a neg
cfb0: 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d  ative nCol, it m
cfc0: 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65  eans two or more
cfd0: 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f   views form a lo
cfe0: 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  op, like this:. 
cff0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45   **.  **     CRE
d000: 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20  ATE VIEW one AS 
d010: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77  SELECT * FROM tw
d020: 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  o;.  **     CREA
d030: 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53  TE VIEW two AS S
d040: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65  ELECT * FROM one
d050: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ;.  **.  ** Actu
d060: 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72  ally, this error
d070: 20 69 73 20 63 61 75 67 68 74 20 70 72 65 76 69   is caught previ
d080: 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65  ously and so the
d090: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a   following test.
d0a0: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61    ** should alwa
d0b0: 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65  ys fail.  But we
d0c0: 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69   will leave it i
d0d0: 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20  n place just to 
d0e0: 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20  be safe..  */.  
d0f0: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
d100: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
d110: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d120: 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
d130: 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
d140: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
d150: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
d160: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
d170: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29  Table->nCol>=0 )
d180: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
d190: 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
d1a0: 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
d1b0: 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c  compute the tabl
d1c0: 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f  e names..  ** No
d1d0: 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  te that the call
d1e0: 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c   to sqlite3Resul
d1f0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
d200: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
d210: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
d220: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20   in the results 
d230: 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20  set of the view 
d240: 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20  and will assign 
d250: 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20  cursors.  ** to 
d260: 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
d270: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
d280: 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20    But we do not 
d290: 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67  want these chang
d2a0: 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65  es.  ** to be pe
d2b0: 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65  rmanent.  So the
d2c0: 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
d2d0: 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f  done on a copy o
d2e0: 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a  f the SELECT.  *
d2f0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  * statement that
d300: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
d310: 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
d320: 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
d330: 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71  t );.  pSel = sq
d340: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
d350: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b  Table->pSelect);
d360: 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20  .  if( pSel ){. 
d370: 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e     n = pParse->n
d380: 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Tab;.    sqlite3
d390: 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
d3a0: 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65  sors(pParse, pSe
d3b0: 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54  l->pSrc);.    pT
d3c0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  able->nCol = -1;
d3d0: 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73  .    pSelTab = s
d3e0: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
d3f0: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
d400: 30 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 70 50  0, pSel);.    pP
d410: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a  arse->nTab = n;.
d420: 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 20      if( pSelTab 
d430: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
d440: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30   pTable->aCol==0
d450: 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65   );.      pTable
d460: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
d470: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54  ->nCol;.      pT
d480: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65  able->aCol = pSe
d490: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
d4a0: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
d4b0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  = 0;.      pSelT
d4c0: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
d4d0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
d4e0: 65 54 61 62 6c 65 28 70 53 65 6c 54 61 62 29 3b  eTable(pSelTab);
d4f0: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 70  .      pTable->p
d500: 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d  Schema->flags |=
d510: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
d520: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d530: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
d540: 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b  = 0;.      nErr+
d550: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  +;.    }.    sql
d560: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
d570: 28 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65  (pSel);.  } else
d580: 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20   {.    nErr++;. 
d590: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
d5a0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
d5b0: 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20  .  return nErr; 
d5c0: 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64   .}.#endif /* !d
d5d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
d5e0: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
d5f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
d600: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a  _VIRTUALTABLE) *
d610: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
d620: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
d630: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
d640: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76  mn names from ev
d650: 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61  ery VIEW in data
d660: 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61  base idx..*/.sta
d670: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56  tic void sqliteV
d680: 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69  iewResetAll(sqli
d690: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78  te3 *db, int idx
d6a0: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
d6b0: 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72  ;.  if( !DbHasPr
d6c0: 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
d6d0: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
d6e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
d6f0: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
d700: 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d  st(&db->aDb[idx]
d710: 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  .pSchema->tblHas
d720: 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61  h); i;i=sqliteHa
d730: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
d740: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
d750: 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
d760: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70  .    if( pTab->p
d770: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
d780: 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d  sqliteResetColum
d790: 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20  nNames(pTab);.  
d7a0: 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61    }.  }.  DbClea
d7b0: 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  rProperty(db, id
d7c0: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
d7d0: 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  ws);.}.#else.# d
d7e0: 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77  efine sqliteView
d7f0: 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65  ResetAll(A,B).#e
d800: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d810: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a  MIT_VIEW */../*.
d820: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d830: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
d840: 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74  e VDBE to adjust
d850: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
d860: 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20  hema.** used by 
d870: 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20  SQLite when the 
d880: 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65  btree layer move
d890: 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70  s a table root p
d8a0: 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74  age. The.** root
d8b0: 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65  -page of a table
d8c0: 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74   or index in dat
d8d0: 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68  abase iDb has ch
d8e0: 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d  anged from iFrom
d8f0: 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a  .** to iTo..**.*
d900: 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20  * Ticket #1728: 
d910: 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c   The symbol tabl
d920: 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f  e might still co
d930: 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ntain informatio
d940: 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61  n.** on tables a
d950: 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68  nd/or indices th
d960: 61 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65  at are the proce
d970: 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65  ss of being dele
d980: 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61  ted..** If you a
d990: 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20  re unlucky, one 
d9a0: 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64  of those deleted
d9b0: 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c   indices or tabl
d9c0: 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65  es might.** have
d9d0: 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61   the same rootpa
d9e0: 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65  ge number as the
d9f0: 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69   real table or i
da00: 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20  ndex that is.** 
da10: 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f  being moved.  So
da20: 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20   we cannot stop 
da30: 73 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20  searching after 
da40: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20  the first match 
da50: 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20  .** because the 
da60: 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68  first match migh
da70: 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20  t be for one of 
da80: 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69  the deleted indi
da90: 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73  ces.** or tables
daa0: 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62   and not the tab
dab0: 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73  le/index that is
dac0: 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
dad0: 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73  moved..** We mus
dae0: 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69  t continue loopi
daf0: 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62  ng until all tab
db00: 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20  les and indices 
db10: 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65  with.** rootpage
db20: 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65  ==iFrom have bee
db30: 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68  n converted to h
db40: 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f  ave a rootpage o
db50: 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65  f iTo.** in orde
db60: 72 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20  r to be certain 
db70: 74 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20  that we got the 
db80: 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69  right one..*/.#i
db90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
dba0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69  T_AUTOVACUUM.voi
dbb0: 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67  d sqlite3RootPag
dbc0: 65 4d 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20  eMoved(Db *pDb, 
dbd0: 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
dbe0: 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  To){.  HashElem 
dbf0: 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a  *pElem;.  Hash *
dc00: 70 48 61 73 68 3b 0a 0a 20 20 70 48 61 73 68 20  pHash;..  pHash 
dc10: 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  = &pDb->pSchema-
dc20: 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28  >tblHash;.  for(
dc30: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
dc40: 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
dc50: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
dc60: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
dc70: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
dc80: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
dc90: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
dca0: 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d  if( pTab->tnum==
dcb0: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
dcc0: 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Tab->tnum = iTo;
dcd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61  .    }.  }.  pHa
dce0: 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65  sh = &pDb->pSche
dcf0: 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66  ma->idxHash;.  f
dd00: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
dd10: 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b  ashFirst(pHash);
dd20: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
dd30: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
dd40: 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  em)){.    Index 
dd50: 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61  *pIdx = sqliteHa
dd60: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
dd70: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75     if( pIdx->tnu
dd80: 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
dd90: 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69    pIdx->tnum = i
dda0: 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  To;.    }.  }.}.
ddb0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
ddc0: 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73  ite code to eras
ddd0: 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  e the table with
dde0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
ddf0: 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  e from database 
de00: 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69  iDb..** Also wri
de10: 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66  te code to modif
de20: 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  y the sqlite_mas
de30: 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  ter table and in
de40: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
de50: 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20   if a root-page 
de60: 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  of another table
de70: 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65   is moved by the
de80: 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69   btree-layer whi
de90: 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69  lst.** erasing i
dea0: 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20  Table (this can 
deb0: 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
dec0: 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
ded0: 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  ase)..*/ .static
dee0: 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f   void destroyRoo
def0: 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61  tPage(Parse *pPa
df00: 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c  rse, int iTable,
df10: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
df20: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
df30: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
df40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
df50: 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  p(v, OP_Destroy,
df60: 20 69 54 61 62 6c 65 2c 20 69 44 62 29 3b 0a 23   iTable, iDb);.#
df70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
df80: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
df90: 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 70 75  /* OP_Destroy pu
dfa0: 73 68 65 73 20 61 6e 20 69 6e 74 65 67 65 72 20  shes an integer 
dfb0: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20  onto the stack. 
dfc0: 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a  If this integer.
dfd0: 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f    ** is non-zero
dfe0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
dff0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
e000: 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76  r of a table mov
e010: 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74  ed to.  ** locat
e020: 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20  ion iTable. The 
e030: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d  following code m
e040: 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c 69  odifies the sqli
e050: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
e060: 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20  to.  ** reflect 
e070: 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this..  **.  ** 
e080: 54 68 65 20 22 23 30 22 20 69 6e 20 74 68 65 20  The "#0" in the 
e090: 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c  SQL is a special
e0a0: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d   constant that m
e0b0: 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61  eans whatever va
e0c0: 6c 75 65 0a 20 20 2a 2a 20 69 73 20 6f 6e 20 74  lue.  ** is on t
e0d0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
e0e0: 61 63 6b 2e 20 20 53 65 65 20 73 71 6c 69 74 65  ack.  See sqlite
e0f0: 33 52 65 67 69 73 74 65 72 45 78 70 72 28 29 2e  3RegisterExpr().
e100: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e  .  */.  sqlite3N
e110: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
e120: 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45  e, .     "UPDATE
e130: 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70   %Q.%s SET rootp
e140: 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 30 20  age=%d WHERE #0 
e150: 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 30 22  AND rootpage=#0"
e160: 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ,.     pParse->d
e170: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
e180: 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
e190: 69 44 62 29 2c 20 69 54 61 62 6c 65 29 3b 0a 23  iDb), iTable);.#
e1a0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  endif.}../*.** W
e1b0: 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rite VDBE code t
e1c0: 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54  o erase table pT
e1d0: 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63  ab and all assoc
e1e0: 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e  iated indices on
e1f0: 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74   disk..** Code t
e200: 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c  o update the sql
e210: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
e220: 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  s and internal s
e230: 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e  chema definition
e240: 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72  s.** in case a r
e250: 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69  oot-page belongi
e260: 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61  ng to another ta
e270: 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
e280: 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a  the btree layer.
e290: 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64  ** is also added
e2a0: 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
e2b0: 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
e2c0: 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
e2d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e2e0: 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72  destroyTable(Par
e2f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
e300: 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66  e *pTab){.#ifdef
e310: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
e320: 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20  OVACUUM.  Index 
e330: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 44 62  *pIdx;.  int iDb
e340: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
e350: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
e360: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
e370: 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f  a);.  destroyRoo
e380: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 54  tPage(pParse, pT
e390: 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ab->tnum, iDb);.
e3a0: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
e3b0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
e3c0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
e3d0: 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  {.    destroyRoo
e3e0: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
e3f0: 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  dx->tnum, iDb);.
e400: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49    }.#else.  /* I
e410: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  f the database m
e420: 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75  ay be auto-vacuu
e430: 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53 51  m capable (if SQ
e440: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
e450: 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  CUUM.  ** is not
e460: 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20   defined), then 
e470: 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
e480: 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72  to call OP_Destr
e490: 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74  oy on the.  ** t
e4a0: 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72  able and index r
e4b0: 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64  oot-pages in ord
e4c0: 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  er, starting wit
e4d0: 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c  h the numericall
e4e0: 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  y .  ** largest 
e4f0: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
e500: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
e510: 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  s that none of t
e520: 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20  he root-pages.  
e530: 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79  ** to be destroy
e540: 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20  ed is relocated 
e550: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50  by an earlier OP
e560: 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69  _Destroy. i.e. i
e570: 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  f the.  ** follo
e580: 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a  wing were coded:
e590: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65  .  **.  ** OP_De
e5a0: 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e  stroy 4 0.  ** .
e5b0: 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  ...  ** OP_Destr
e5c0: 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a  oy 5 0.  **.  **
e5d0: 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35   and root page 5
e5e0: 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20   happened to be 
e5f0: 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
e600: 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20  -page number in 
e610: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
e620: 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67  e, then root pag
e630: 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76  e 5 would be mov
e640: 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79 20  ed to page 4 by 
e650: 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65  the .  ** "OP_De
e660: 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64  stroy 4 0" opcod
e670: 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65 6e  e. The subsequen
e680: 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  t "OP_Destroy 5 
e690: 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a  0" would hit.  *
e6a0: 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61  * a free-list pa
e6b0: 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69  ge..  */.  int i
e6c0: 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  Tab = pTab->tnum
e6d0: 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79  ;.  int iDestroy
e6e0: 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  ed = 0;..  while
e6f0: 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ( 1 ){.    Index
e700: 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20   *pIdx;.    int 
e710: 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20  iLargest = 0;.. 
e720: 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79 65     if( iDestroye
e730: 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65  d==0 || iTab<iDe
e740: 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20  stroyed ){.     
e750: 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62   iLargest = iTab
e760: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
e770: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
e780: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
e790: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
e7a0: 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64    int iIdx = pId
e7b0: 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61  x->tnum;.      a
e7c0: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63  ssert( pIdx->pSc
e7d0: 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
e7e0: 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ema );.      if(
e7f0: 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20   (iDestroyed==0 
e800: 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f  || (iIdx<iDestro
e810: 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c  yed)) && iIdx>iL
e820: 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20  argest ){.      
e830: 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64    iLargest = iId
e840: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
e850: 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73  .    if( iLarges
e860: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
e870: 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  turn;.    }else{
e880: 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
e890: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
e8a0: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
e8b0: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
e8c0: 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 52  ;.      destroyR
e8d0: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
e8e0: 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a  iLargest, iDb);.
e8f0: 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65 64        iDestroyed
e900: 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20   = iLargest;.   
e910: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a   }.  }.#endif.}.
e920: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
e930: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
e940: 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
e950: 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
e960: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65  tement..** pName
e970: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
e980: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
e990: 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dropped..*/.void
e9a0: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c   sqlite3DropTabl
e9b0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
e9c0: 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
e9d0: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74   int isView, int
e9e0: 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65   noErr){.  Table
e9f0: 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a   *pTab;.  Vdbe *
ea00: 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
ea10: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
ea20: 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28   int iDb;..  if(
ea30: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
ea40: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61   sqlite3MallocFa
ea50: 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 67 6f  iled() ){.    go
ea60: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
ea70: 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  le;.  }.  assert
ea80: 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
ea90: 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   );.  pTab = sql
eaa0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
eab0: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61  pParse, pName->a
eac0: 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
ead0: 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
eae0: 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  );..  if( pTab==
eaf0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45  0 ){.    if( noE
eb00: 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rr ){.      sqli
eb10: 74 65 33 45 72 72 6f 72 43 6c 65 61 72 28 70 50  te3ErrorClear(pP
eb20: 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
eb30: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
eb40: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62  table;.  }.  iDb
eb50: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
eb60: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
eb70: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
eb80: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
eb90: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23  iDb<db->nDb );.#
eba0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ebb0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
ebc0: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
ebd0: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
ebe0: 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
ebf0: 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
ec00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
ec10: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
ec20: 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
ec30: 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30   char *zArg2 = 0
ec40: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
ec50: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
ec60: 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
ec70: 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29  , zTab, 0, zDb))
ec80: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
ec90: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
eca0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
ecb0: 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
ecc0: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
ecd0: 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
ece0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
ecf0: 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  DROP_TEMP_VIEW;.
ed00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ed10: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
ed20: 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20  TE_DROP_VIEW;.  
ed30: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
ed40: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
ed50: 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
ed60: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
ed70: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Tab) ){.      if
ed80: 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  ( sqlite3ViewGet
ed90: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
eda0: 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20  se, pTab) ){.   
edb0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
edc0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 20  rop_table;.     
edd0: 20 7d 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20   }.      code = 
ede0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
edf0: 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20  LE;.      zArg2 
ee00: 3d 20 70 54 61 62 2d 3e 70 4d 6f 64 2d 3e 7a 4e  = pTab->pMod->zN
ee10: 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ame;.#endif.    
ee20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
ee30: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
ee40: 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
ee50: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
ee60: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
ee70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ee80: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
ee90: 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b  LITE_DROP_TABLE;
eea0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
eeb0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
eec0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
eed0: 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  code, pTab->zNam
eee0: 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29  e, zArg2, zDb) )
eef0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
ef00: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
ef10: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
ef20: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
ef30: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
ef40: 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
ef50: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
ef60: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
ef70: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
ef80: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
ef90: 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c  Tab->readOnly ||
efa0: 20 70 54 61 62 3d 3d 64 62 2d 3e 61 44 62 5b 69   pTab==db->aDb[i
efb0: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 70 53 65  Db].pSchema->pSe
efc0: 71 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  qTab ){.    sqli
efd0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
efe0: 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
eff0: 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
f000: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
f010: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
f020: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  rop_table;.  }..
f030: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f040: 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e  MIT_VIEW.  /* En
f050: 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20  sure DROP TABLE 
f060: 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61  is not used on a
f070: 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20   view, and DROP 
f080: 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64  VIEW is not used
f090: 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65  .  ** on a table
f0a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56  ..  */.  if( isV
f0b0: 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
f0c0: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
f0d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f0e0: 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
f0f0: 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65   TABLE to delete
f100: 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62   table %s", pTab
f110: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
f120: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
f130: 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69  le;.  }.  if( !i
f140: 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
f150: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
f160: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f170: 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
f180: 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76  VIEW to delete v
f190: 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  iew %s", pTab->z
f1a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
f1b0: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
f1c0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
f1d0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
f1e0: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
f1f0: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
f200: 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
f210: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
f220: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f230: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
f240: 20 76 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65   v ){.    Trigge
f250: 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20  r *pTrigger;.   
f260: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
f270: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71  aDb[iDb];.    sq
f280: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
f290: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
f2a0: 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   0, iDb);..#ifnd
f2b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
f2c0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
f2d0: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
f2e0: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 56 64 62  ab) ){.      Vdb
f2f0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
f300: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
f310: 20 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20       if( v ){.  
f320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f330: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 42 65  eAddOp(v, OP_VBe
f340: 67 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  gin, 0, 0);.    
f350: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
f360: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
f370: 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63  l triggers assoc
f380: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
f390: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
f3a0: 65 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20  ed. Code.    ** 
f3b0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
f3c0: 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  remove entries f
f3d0: 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  rom sqlite_maste
f3e0: 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20  r and/or.    ** 
f3f0: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
f400: 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  er if required..
f410: 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67      */.    pTrig
f420: 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69  ger = pTab->pTri
f430: 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  gger;.    while(
f440: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
f450: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
f460: 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  ger->pSchema==pT
f470: 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a  ab->pSchema || .
f480: 20 20 20 20 20 20 20 20 20 20 70 54 72 69 67 67            pTrigg
f490: 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  er->pSchema==db-
f4a0: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
f4b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f4c0: 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70  DropTriggerPtr(p
f4d0: 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29  Parse, pTrigger)
f4e0: 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72  ;.      pTrigger
f4f0: 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
f500: 78 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  xt;.    }..#ifnd
f510: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
f520: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
f530: 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65   /* Remove any e
f540: 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71  ntries of the sq
f550: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
f560: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
f570: 69 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  ith.    ** the t
f580: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
f590: 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ed. This is done
f5a0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c   before the tabl
f5b0: 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20  e is dropped.   
f5c0: 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65   ** at the btree
f5d0: 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20   level, in case 
f5e0: 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
f5f0: 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20  nce table needs 
f600: 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61  to.    ** move a
f610: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
f620: 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70  e drop (can happ
f630: 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
f640: 6d 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a  m mode)..    */.
f650: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 75      if( pTab->au
f660: 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 73  toInc ){.      s
f670: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
f680: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
f690: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
f6a0: 73 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  s.sqlite_sequenc
f6b0: 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  e WHERE name=%Q"
f6c0: 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ,.        pDb->z
f6d0: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
f6e0: 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
f6f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
f700: 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f  Drop all SQLITE_
f710: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64  MASTER table and
f720: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74   index entries t
f730: 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
f740: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54  .    ** table. T
f750: 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20  he program name 
f760: 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68  loops through th
f770: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
f780: 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a  nd deletes.    *
f790: 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74  * every row that
f7a0: 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
f7b0: 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  le of the same n
f7c0: 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62  ame as the one b
f7d0: 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70  eing.    ** drop
f7e0: 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72  ped. Triggers ar
f7f0: 65 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61  e handled sepera
f800: 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74  tely because a t
f810: 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20  rigger can be.  
f820: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20    ** created in 
f830: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
f840: 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  e that refers to
f850: 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74   a table in anot
f860: 68 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  her.    ** datab
f870: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
f880: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
f890: 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
f8a0: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
f8b0: 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c   %Q.%s WHERE tbl
f8c0: 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70  _name=%Q and typ
f8d0: 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20  e!='trigger'",. 
f8e0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
f8f0: 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
f900: 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  iDb), pTab->zNam
f910: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56  e);.    if( !isV
f920: 69 65 77 20 26 26 20 21 49 73 56 69 72 74 75 61  iew && !IsVirtua
f930: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
f940: 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50   destroyTable(pP
f950: 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20  arse, pTab);.   
f960: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76   }..    /* Remov
f970: 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  e the table entr
f980: 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20  y from SQLite's 
f990: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
f9a0: 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a  and modify.    *
f9b0: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * the schema coo
f9c0: 6b 69 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  kie..    */.    
f9d0: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
f9e0: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ab) ){.      sql
f9f0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
fa00: 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c  P_VDestroy, iDb,
fa10: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
fa20: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
fa30: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
fa40: 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69   OP_DropTable, i
fa50: 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  Db, 0, pTab->zNa
fa60: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
fa70: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
fa80: 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 7d  db, v, iDb);.  }
fa90: 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  .  sqliteViewRes
faa0: 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a  etAll(db, iDb);.
fab0: 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65  .exit_drop_table
fac0: 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
fad0: 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b  stDelete(pName);
fae0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
faf0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
fb00: 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
fb10: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20   foreign key on 
fb20: 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72  the table.** cur
fb30: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
fb40: 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f  struction.  pFro
fb50: 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20  mCol determines 
fb60: 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  which columns.**
fb70: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
fb80: 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74  table point to t
fb90: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20  he foreign key. 
fba0: 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20   If pFromCol==0 
fbb0: 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20  then.** connect 
fbc0: 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c  the key to the l
fbd0: 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72  ast column inser
fbe0: 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65  ted.  pTo is the
fbf0: 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20   name of.** the 
fc00: 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74  table referred t
fc10: 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20  o.  pToCol is a 
fc20: 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  list of tables i
fc30: 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70  n the other.** p
fc40: 54 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74 68  To table that th
fc50: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f  e foreign key po
fc60: 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20  ints to.  flags 
fc70: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20  contains all.** 
fc80: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
fc90: 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72  t the conflict r
fca0: 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
fcb0: 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a  thms specified.*
fcc0: 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45  * in the ON DELE
fcd0: 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e  TE, ON UPDATE an
fce0: 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75  d ON INSERT clau
fcf0: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b  ses..**.** An FK
fd00: 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ey structure is 
fd10: 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65  created and adde
fd20: 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  d to the table c
fd30: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65  urrently.** unde
fd40: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
fd50: 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e  n the pParse->pN
fd60: 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20  ewTable field.  
fd70: 54 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20  The new FKey.** 
fd80: 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e  is not linked in
fd90: 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20  to db->aFKey at 
fda0: 74 68 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61  this point - tha
fdb0: 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65  t does not happe
fdc0: 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74  n.** until sqlit
fdd0: 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a  e3EndTable()..**
fde0: 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20  .** The foreign 
fdf0: 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49  key is set for I
fe00: 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73  MMEDIATE process
fe10: 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65  ing.  A subseque
fe20: 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71  nt call.** to sq
fe30: 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
fe40: 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61  nKey() might cha
fe50: 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45  nge this to DEFE
fe60: 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  RRED..*/.void sq
fe70: 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69  lite3CreateForei
fe80: 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  gnKey(.  Parse *
fe90: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
fea0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
feb0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
fec0: 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f  pFromCol,  /* Co
fed0: 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61  lumns in this ta
fee0: 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ble that point t
fef0: 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  o other table */
ff00: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20  .  Token *pTo,  
ff10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
ff20: 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  of the other tab
ff30: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
ff40: 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20   *pToCol,    /* 
ff50: 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  Columns in the o
ff60: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
ff70: 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
ff80: 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
ff90: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
ffa0: 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 23 69  rithms. */.){.#i
ffb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ffc0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
ffd0: 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b  FKey *pFKey = 0;
ffe0: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50  .  Table *p = pP
fff0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
10000 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
10010 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
10020 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  l;.  char *z;.. 
10030 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20   assert( pTo!=0 
10040 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
10050 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
10060 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
10070 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
10080 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
10090 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  0 ){.    int iCo
100a0 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  l = p->nCol-1;. 
100b0 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
100c0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
100d0 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
100e0 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20  ToCol->nExpr!=1 
100f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10100 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10110 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e   "foreign key on
10120 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20   %s".         " 
10130 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
10140 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
10150 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20   of table %T",. 
10160 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b          p->aCol[
10170 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f  iCol].zName, pTo
10180 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  );.      goto fk
10190 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
101a0 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  nCol = 1;.  }els
101b0 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20  e if( pToCol && 
101c0 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70  pToCol->nExpr!=p
101d0 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29  FromCol->nExpr )
101e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
101f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
10200 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66        "number of
10210 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65   columns in fore
10220 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ign key does not
10230 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
10240 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22  r of ".        "
10250 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
10260 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22  eferenced table"
10270 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  );.    goto fk_e
10280 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  nd;.  }else{.   
10290 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c   nCol = pFromCol
102a0 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e  ->nExpr;.  }.  n
102b0 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
102c0 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a  FKey) + nCol*siz
102d0 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  eof(pFKey->aCol[
102e0 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31  0]) + pTo->n + 1
102f0 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  ;.  if( pToCol )
10300 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
10310 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20  <pToCol->nExpr; 
10320 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  i++){.      nByt
10330 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43  e += strlen(pToC
10340 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20  ol->a[i].zName) 
10350 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
10360 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d   pFKey = sqliteM
10370 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
10380 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29    if( pFKey==0 )
10390 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
103a0 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70  pFKey->pFrom = p
103b0 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
103c0 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b  From = p->pFKey;
103d0 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70  .  z = (char*)&p
103e0 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79  FKey[1];.  pFKey
103f0 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74  ->aCol = (struct
10400 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a   sColMap*)z;.  z
10410 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63   += sizeof(struc
10420 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b  t sColMap)*nCol;
10430 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20  .  pFKey->zTo = 
10440 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70  z;.  memcpy(z, p
10450 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a  To->z, pTo->n);.
10460 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b    z[pTo->n] = 0;
10470 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31  .  z += pTo->n+1
10480 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
10490 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  To = 0;.  pFKey-
104a0 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
104b0 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
104c0 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  ){.    pFKey->aC
104d0 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d  ol[0].iFrom = p-
104e0 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65  >nCol-1;.  }else
104f0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
10500 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
10510 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
10520 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43  for(j=0; j<p->nC
10530 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
10540 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
10550 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ICmp(p->aCol[j].
10560 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d  zName, pFromCol-
10570 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
10580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b  ){.          pFK
10590 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f  ey->aCol[i].iFro
105a0 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  m = j;.         
105b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
105c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
105d0 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29  if( j>=p->nCol )
105e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
105f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10600 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e  , .          "un
10610 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25  known column \"%
10620 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  s\" in foreign k
10630 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20  ey definition", 
10640 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
10650 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
10660 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
10670 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  k_end;.      }. 
10680 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
10690 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
106a0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
106b0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
106c0 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d  = strlen(pToCol-
106d0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
106e0 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
106f0 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20  i].zCol = z;.   
10700 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f     memcpy(z, pTo
10710 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  Col->a[i].zName,
10720 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20   n);.      z[n] 
10730 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  = 0;.      z += 
10740 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n+1;.    }.  }. 
10750 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
10760 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  ed = 0;.  pFKey-
10770 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c  >deleteConf = fl
10780 61 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46  ags & 0xff;.  pF
10790 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20  Key->updateConf 
107a0 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20  = (flags >> 8 ) 
107b0 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d  & 0xff;.  pFKey-
107c0 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66  >insertConf = (f
107d0 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30  lags >> 16 ) & 0
107e0 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  xff;..  /* Link 
107f0 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
10800 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20  to the table as 
10810 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20  the last step.. 
10820 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d   */.  p->pFKey =
10830 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20   pFKey;.  pFKey 
10840 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20  = 0;..fk_end:.  
10850 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79  sqliteFree(pFKey
10860 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  );.#endif /* !de
10870 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10880 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a  T_FOREIGN_KEY) *
10890 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  /.  sqlite3ExprL
108a0 69 73 74 44 65 6c 65 74 65 28 70 46 72 6f 6d 43  istDelete(pFromC
108b0 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ol);.  sqlite3Ex
108c0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6f  prListDelete(pTo
108d0 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Col);.}../*.** T
108e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
108f0 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e  alled when an IN
10900 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
10910 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44  E or INITIALLY D
10920 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73  EFERRED.** claus
10930 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72  e is seen as par
10940 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b  t of a foreign k
10950 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20  ey definition.  
10960 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a  The isDeferred.*
10970 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31  * parameter is 1
10980 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44   for INITIALLY D
10990 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f  EFERRED and 0 fo
109a0 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  r INITIALLY IMME
109b0 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65  DIATE..** The be
109c0 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f  havior of the mo
109d0 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61  st recently crea
109e0 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ted foreign key 
109f0 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61  is adjusted.** a
10a00 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76  ccordingly..*/.v
10a10 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72  oid sqlite3Defer
10a20 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65  ForeignKey(Parse
10a30 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73   *pParse, int is
10a40 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64  Deferred){.#ifnd
10a50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
10a60 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62  OREIGN_KEY.  Tab
10a70 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79  le *pTab;.  FKey
10a80 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28   *pFKey;.  if( (
10a90 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
10aa0 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20  NewTable)==0 || 
10ab0 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70  (pFKey = pTab->p
10ac0 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72  FKey)==0 ) retur
10ad0 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65  n;.  pFKey->isDe
10ae0 66 65 72 72 65 64 20 3d 20 69 73 44 65 66 65 72  ferred = isDefer
10af0 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  red;.#endif.}../
10b00 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
10b10 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61  de that will era
10b20 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e  se and refill in
10b30 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73  dex *pIdx.  This
10b40 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69   is.** used to i
10b50 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c  nitialize a newl
10b60 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20  y created index 
10b70 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  or to recompute 
10b80 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
10b90 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65  f an index in re
10ba0 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e  sponse to a REIN
10bb0 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
10bc0 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67  ** if memRootPag
10bd0 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76  e is not negativ
10be0 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
10bf0 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65   the index is ne
10c00 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20  wly.** created. 
10c10 20 54 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   The memory cell
10c20 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
10c30 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
10c40 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
10c50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
10c60 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
10c70 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
10c80 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
10c90 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
10ca0 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
10cb0 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
10cc0 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
10cd0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
10ce0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
10cf0 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
10d00 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
10d10 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
10d20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
10d30 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  llIndex(Parse *p
10d40 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
10d50 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f  ndex, int memRoo
10d60 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20  tPage){.  Table 
10d70 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
10d80 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20  pTable;  /* The 
10d90 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
10da0 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
10db0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
10dc0 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 42 74 72  ab;       /* Btr
10dd0 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
10de0 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  or pTab */.  int
10df0 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
10e00 6e 54 61 62 2b 31 3b 20 20 20 20 20 2f 2a 20 42  nTab+1;     /* B
10e10 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
10e20 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20   for pIndex */. 
10e30 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f  /* Address of to
10e60 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  p of loop */.  i
10e70 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  nt tnum;        
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10e90 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e   Root page of in
10ea0 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
10eb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10ec0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
10ed0 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
10ee0 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
10ef0 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  ne */.  KeyInfo 
10f00 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  *pKey;          
10f10 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66         /* KeyInf
10f20 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  o for index */. 
10f30 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
10f40 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
10f50 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64  pParse->db, pInd
10f60 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23  ex->pSchema);..#
10f70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10f80 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
10f90 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
10fa0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
10fb0 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20  SQLITE_REINDEX, 
10fc0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
10fd0 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ,.      pParse->
10fe0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
10ff0 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75  me ) ){.    retu
11000 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
11010 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77    /* Require a w
11020 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
11030 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72   table to perfor
11040 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  m this operation
11050 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62   */.  sqlite3Tab
11060 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
11070 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
11080 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  1, pTab->zName);
11090 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
110a0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
110b0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
110c0 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  urn;.  if( memRo
110d0 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  otPage>=0 ){.   
110e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
110f0 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
11100 20 6d 65 6d 52 6f 6f 74 50 61 67 65 2c 20 30 29   memRootPage, 0)
11110 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 30 3b 0a  ;.    tnum = 0;.
11120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75    }else{.    tnu
11130 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  m = pIndex->tnum
11140 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11150 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 65  eAddOp(v, OP_Cle
11160 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ar, tnum, iDb);.
11170 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
11180 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
11190 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
111a0 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49   pKey = sqlite3I
111b0 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72  ndexKeyinfo(pPar
111c0 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73  se, pIndex);.  s
111d0 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
111e0 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69   OP_OpenWrite, i
111f0 49 64 78 2c 20 74 6e 75 6d 2c 20 28 63 68 61 72  Idx, tnum, (char
11200 20 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49   *)pKey, P3_KEYI
11210 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
11220 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
11230 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69  (pParse, iTab, i
11240 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
11250 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20  nRead);.  addr1 
11260 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
11270 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
11280 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c   iTab, 0);.  sql
11290 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
112a0 78 4b 65 79 28 76 2c 20 70 49 6e 64 65 78 2c 20  xKey(v, pIndex, 
112b0 69 54 61 62 29 3b 0a 20 20 69 66 28 20 70 49 6e  iTab);.  if( pIn
112c0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
112d0 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74  _None ){.    int
112e0 20 63 75 72 61 64 64 72 20 3d 20 73 71 6c 69 74   curaddr = sqlit
112f0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
11300 72 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 61 64  r(v);.    int ad
11310 64 72 32 20 3d 20 63 75 72 61 64 64 72 2b 34 3b  dr2 = curaddr+4;
11320 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11330 43 68 61 6e 67 65 50 32 28 76 2c 20 63 75 72 61  ChangeP2(v, cura
11340 64 64 72 2d 31 2c 20 61 64 64 72 32 29 3b 0a 20  ddr-1, addr2);. 
11350 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11360 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  dOp(v, OP_Rowid,
11370 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73   iTab, 0);.    s
11380 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11390 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c  v, OP_AddImm, 1,
113a0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
113b0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
113c0 49 73 55 6e 69 71 75 65 2c 20 69 49 64 78 2c 20  IsUnique, iIdx, 
113d0 61 64 64 72 32 29 3b 0a 20 20 20 20 73 71 6c 69  addr2);.    sqli
113e0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
113f0 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f  _Halt, SQLITE_CO
11400 4e 53 54 52 41 49 4e 54 2c 20 4f 45 5f 41 62 6f  NSTRAINT, OE_Abo
11410 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
11420 20 20 20 20 20 20 20 20 22 69 6e 64 65 78 65 64          "indexed
11430 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74   columns are not
11440 20 75 6e 69 71 75 65 22 2c 20 50 33 5f 53 54 41   unique", P3_STA
11450 54 49 43 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TIC);.    assert
11460 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  ( sqlite3MallocF
11470 61 69 6c 65 64 28 29 20 7c 7c 20 61 64 64 72 32  ailed() || addr2
11480 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  ==sqlite3VdbeCur
11490 72 65 6e 74 41 64 64 72 28 76 29 20 29 3b 0a 20  rentAddr(v) );. 
114a0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
114b0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49  AddOp(v, OP_IdxI
114c0 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 30 29 3b  nsert, iIdx, 0);
114d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
114e0 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
114f0 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a  iTab, addr1+1);.
11500 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
11510 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
11520 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
11530 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
11540 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c   iTab, 0);.  sql
11550 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11560 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c   OP_Close, iIdx,
11570 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   0);.}../*.** Cr
11580 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
11590 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
115a0 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65  e.  pName1.pName
115b0 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  2 is the name of
115c0 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
115d0 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74  nd pTblList is t
115e0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
115f0 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
11600 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
11610 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
11620 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
11630 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
11640 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
11650 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
11660 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
11670 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
11680 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
11690 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
116a0 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
116b0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
116c0 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
116d0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
116e0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
116f0 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
11700 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
11710 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
11720 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
11730 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
11740 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
11750 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
11760 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
11770 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
11780 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
11790 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
117a0 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
117b0 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
117c0 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
117d0 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
117e0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
117f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
11800 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61  reateIndex(.  Pa
11810 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
11820 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74   /* All informat
11830 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70  ion about this p
11840 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  arse */.  Token 
11850 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
11860 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e  First part of in
11870 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
11880 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
11890 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
118a0 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
118b0 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
118c0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63  be NULL */.  Src
118d0 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20  List *pTblName, 
118e0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65  /* Table to inde
118f0 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70  x. Use pParse->p
11900 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f  NewTable if 0 */
11910 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
11920 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  st,   /* A list 
11930 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
11940 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
11950 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
11960 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45   /* OE_Abort, OE
11970 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c  _Ignore, OE_Repl
11980 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20  ace, or OE_None 
11990 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
119a0 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  rt,     /* The C
119b0 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
119c0 20 62 65 67 69 6e 73 20 61 20 43 52 45 41 54 45   begins a CREATE
119d0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
119e0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e   */.  Token *pEn
119f0 64 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d,       /* The 
11a00 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20  ")" that closes 
11a10 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
11a20 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
11a30 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20  int sortOrder,  
11a40 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72     /* Sort order
11a50 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20   of primary key 
11a60 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c  when pList==NULL
11a70 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45   */.  int ifNotE
11a80 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74  xist     /* Omit
11a90 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20   error if index 
11aa0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
11ab0 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
11ac0 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  ab = 0;     /* T
11ad0 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
11ae0 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
11af0 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20  Index = 0;   /* 
11b00 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
11b10 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61  created */.  cha
11b20 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20  r *zName = 0;   
11b30 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
11b40 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
11b50 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
11b60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
11b70 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d  aracters in zNam
11b80 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  e */.  int i, j;
11b90 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b  .  Token nullId;
11ba0 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20          /* Fake 
11bb0 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70  token for an emp
11bc0 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20  ty ID list */.  
11bd0 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
11be0 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69       /* For assi
11bf0 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
11c00 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
11c10 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
11c20 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f  rMask;   /* 1 to
11c30 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69   honor DESC in i
11c40 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f  ndex.  0 to igno
11c50 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  re. */.  sqlite3
11c60 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11c70 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  b;.  Db *pDb;   
11c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11c90 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20   specific table 
11ca0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
11cb0 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20  ndexed database 
11cc0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
11cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
11ce0 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
11cf0 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  se that is being
11d00 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f   written */.  To
11d10 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20  ken *pName = 0; 
11d20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
11d30 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  d name of the in
11d40 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  dex to create */
11d50 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
11d60 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74  st_item *pListIt
11d70 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  em; /* For loopi
11d80 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f  ng over pList */
11d90 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69  .  int nCol;.  i
11da0 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20  nt nExtra = 0;. 
11db0 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 0a   char *zExtra;..
11dc0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
11dd0 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c  rr || sqlite3Mal
11de0 6c 6f 63 46 61 69 6c 65 64 28 29 20 7c 7c 20 49  locFailed() || I
11df0 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
11e00 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
11e10 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11e20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  }..  /*.  ** Fin
11e30 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  d the table that
11e40 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
11e50 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79  d.  Return early
11e60 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
11e70 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61   */.  if( pTblNa
11e80 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a  me!=0 ){..    /*
11e90 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72   Use the two-par
11ea0 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20  t index name to 
11eb0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61  determine the da
11ec0 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74  tabase .    ** t
11ed0 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  o search for the
11ee0 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68   table. 'Fix' th
11ef0 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  e table name to 
11f00 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62  this db.    ** b
11f10 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70  efore looking up
11f20 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
11f30 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
11f40 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20  Name1 && pName2 
11f50 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  );.    iDb = sql
11f60 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
11f70 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
11f80 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
11f90 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
11fa0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11fb0 65 5f 69 6e 64 65 78 3b 0a 0a 23 69 66 6e 64 65  e_index;..#ifnde
11fc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45  f SQLITE_OMIT_TE
11fd0 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  MPDB.    /* If t
11fe0 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61  he index name wa
11ff0 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63  s unqualified, c
12000 68 65 63 6b 20 69 66 20 74 68 65 20 74 68 65 20  heck if the the 
12010 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  table.    ** is 
12020 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66  a temp table. If
12030 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74   so, set the dat
12040 61 62 61 73 65 20 74 6f 20 31 2e 0a 20 20 20 20  abase to 1..    
12050 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71  */.    pTab = sq
12060 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
12070 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e  up(pParse, pTblN
12080 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ame);.    if( pN
12090 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e  ame2 && pName2->
120a0 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20  n==0 && pTab && 
120b0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  pTab->pSchema==d
120c0 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
120d0 61 20 29 7b 0a 20 20 20 20 20 20 69 44 62 20 3d  a ){.      iDb =
120e0 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
120f0 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
12100 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
12110 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e  pParse, iDb, "in
12120 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a  dex", pName) &&.
12130 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
12140 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c  ixSrcList(&sFix,
12150 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29   pTblName).    )
12160 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75  {.      /* Becau
12170 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63 6f  se the parser co
12180 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d  nstructs pTblNam
12190 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  e from a single 
121a0 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20  identifier,.    
121b0 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53    ** sqlite3FixS
121c0 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72  rcList can never
121d0 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   fail. */.      
121e0 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d  assert(0);.    }
121f0 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
12200 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
12210 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 2d  Parse, pTblName-
12220 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20  >a[0].zName, .  
12230 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e        pTblName->
12240 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
12250 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29  .    if( !pTab )
12260 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12270 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
12280 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62  ert( db->aDb[iDb
12290 5d 2e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ].pSchema==pTab-
122a0 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d 65  >pSchema );.  }e
122b0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
122c0 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
122d0 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   pTab = pParse->
122e0 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69  pNewTable;.    i
122f0 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20  f( !pTab ) goto 
12300 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12310 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  x;.    iDb = sql
12320 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
12330 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
12340 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20  ema);.  }.  pDb 
12350 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
12360 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ..  if( pTab==0 
12370 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
12380 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
12390 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20  te_index;.  if( 
123a0 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  pTab->readOnly )
123b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
123c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
123d0 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20  able %s may not 
123e0 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61  be indexed", pTa
123f0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
12400 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12410 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64  index;.  }.#ifnd
12420 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
12430 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  IEW.  if( pTab->
12440 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
12450 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12460 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61  Parse, "views ma
12470 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
12480 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
12490 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
124a0 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
124b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
124c0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
124d0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
124e0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
124f0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12500 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73   "virtual tables
12510 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
12520 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
12530 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12540 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  x;.  }.#endif.. 
12550 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
12560 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
12570 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  dex.  Make sure 
12580 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72  there is not alr
12590 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a  eady another.  *
125a0 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
125b0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
125c0 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ame.  .  **.  **
125d0 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20   Exception:  If 
125e0 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
125f0 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d  he names of perm
12600 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72  anent indices fr
12610 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  om the.  ** sqli
12620 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
12630 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74  (because some ot
12640 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e  her process chan
12650 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20  ged the schema) 
12660 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20  and.  ** one of 
12670 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  the index names 
12680 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68  collides with th
12690 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  e name of a temp
126a0 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20  orary table or. 
126b0 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
126c0 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
126d0 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
126e0 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
126f0 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
12700 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
12710 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
12720 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
12730 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
12740 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
12750 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
12760 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
12770 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
12780 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
12790 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
127a0 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20  ken(pName);.    
127b0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
127c0 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
127d0 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
127e0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
127f0 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  x;.    if( zName
12800 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
12810 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
12820 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
12830 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
12840 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
12850 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
12860 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12870 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
12880 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
12890 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66  busy ){.      if
128a0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
128b0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
128c0 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
128d0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
128e0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
128f0 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
12900 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a  zName, 0)!=0 ){.
12910 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
12920 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12930 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
12940 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
12950 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
12960 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
12970 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
12980 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
12990 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
129a0 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70  dex(db, zName, p
129b0 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  Db->zName)!=0 ){
129c0 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f  .      if( !ifNo
129d0 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20  tExist ){.      
129e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
129f0 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
12a00 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73   %s already exis
12a10 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ts", zName);.   
12a20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
12a30 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12a40 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  x;.    }.  }else
12a50 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
12a60 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  30];.    int n;.
12a70 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70      Index *pLoop
12a80 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ;.    for(pLoop=
12a90 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d  pTab->pIndex, n=
12aa0 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  1; pLoop; pLoop=
12ab0 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b  pLoop->pNext, n+
12ac0 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66  +){}.    sprintf
12ad0 28 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a  (zBuf,"_%d",n);.
12ae0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
12af0 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
12b00 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c  ing(&zName, "sql
12b10 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c  ite_autoindex_",
12b20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42   pTab->zName, zB
12b30 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  uf, (char*)0);. 
12b40 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
12b50 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
12b60 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  te_index;.  }.. 
12b70 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75   /* Check for au
12b80 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63  thorization to c
12b90 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a  reate an index..
12ba0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
12bb0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
12bc0 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63  ZATION.  {.    c
12bd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
12be0 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20   pDb->zName;.   
12bf0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
12c00 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
12c10 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
12c20 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
12c30 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
12c40 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12c50 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
12c60 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52     i = SQLITE_CR
12c70 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20  EATE_INDEX;.    
12c80 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
12c90 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d   && iDb==1 ) i =
12ca0 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
12cb0 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
12cc0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
12cd0 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a  eck(pParse, i, z
12ce0 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
12cf0 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
12d00 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12d10 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
12d20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
12d30 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20  If pList==0, it 
12d40 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69  means this routi
12d50 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ne was called to
12d60 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a   make a primary.
12d70 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20    ** key out of 
12d80 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
12d90 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
12da0 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
12db0 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63  ction..  ** So c
12dc0 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73  reate a fake lis
12dd0 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68  t to simulate th
12de0 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  is..  */.  if( p
12df0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  List==0 ){.    n
12e00 75 6c 6c 49 64 2e 7a 20 3d 20 28 75 38 2a 29 70  ullId.z = (u8*)p
12e10 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
12e20 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20  nCol-1].zName;. 
12e30 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74     nullId.n = st
12e40 72 6c 65 6e 28 28 63 68 61 72 2a 29 6e 75 6c 6c  rlen((char*)null
12e50 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74  Id.z);.    pList
12e60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
12e70 73 74 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 26  stAppend(0, 0, &
12e80 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28  nullId);.    if(
12e90 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
12ea0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12eb0 65 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  ex;.    pList->a
12ec0 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
12ed0 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a  sortOrder;.  }..
12ee0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
12ef0 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  how many bytes o
12f00 66 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75  f space are requ
12f10 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78  ired to store ex
12f20 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70  plicitly.  ** sp
12f30 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f  ecified collatio
12f40 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73  n sequence names
12f50 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
12f60 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
12f70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
12f80 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   *pExpr = pList-
12f90 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
12fa0 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20   if( pExpr ){.  
12fb0 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31      nExtra += (1
12fc0 20 2b 20 73 74 72 6c 65 6e 28 70 45 78 70 72 2d   + strlen(pExpr-
12fd0 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b  >pColl->zName));
12fe0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12ff0 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20   .  ** Allocate 
13000 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
13010 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61  ure. .  */.  nNa
13020 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  me = strlen(zNam
13030 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69  e);.  nCol = pLi
13040 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
13050 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  dex = sqliteMall
13060 6f 63 28 20 0a 20 20 20 20 20 20 73 69 7a 65 6f  oc( .      sizeo
13070 66 28 49 6e 64 65 78 29 20 2b 20 20 20 20 20 20  f(Index) +      
13080 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
13090 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20   structure  */. 
130a0 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29       sizeof(int)
130b0 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20  *nCol +         
130c0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c    /* Index.aiCol
130d0 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 73  umn   */.      s
130e0 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 43 6f 6c  izeof(int)*(nCol
130f0 2b 31 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 49  +1) +       /* I
13100 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 20 20 20  ndex.aiRowEst   
13110 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
13120 63 68 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20  char *)*nCol +  
13130 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
13140 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20  zColl     */.   
13150 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43     sizeof(u8)*nC
13160 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  ol +            
13170 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72  /* Index.aSortOr
13180 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61  der */.      nNa
13190 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20  me + 1 +        
131a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
131b0 65 78 2e 7a 4e 61 6d 65 20 20 20 20 20 20 2a 2f  ex.zName      */
131c0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 20 20  .      nExtra   
131d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131e0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e      /* Collation
131f0 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 20   sequence names 
13200 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 73 71  */.  );.  if( sq
13210 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
13220 64 28 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  d() ) goto exit_
13230 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13240 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d  pIndex->azColl =
13250 20 28 63 68 61 72 2a 2a 29 28 26 70 49 6e 64 65   (char**)(&pInde
13260 78 5b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  x[1]);.  pIndex-
13270 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74  >aiColumn = (int
13280 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43   *)(&pIndex->azC
13290 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49  oll[nCol]);.  pI
132a0 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d  ndex->aiRowEst =
132b0 20 28 75 6e 73 69 67 6e 65 64 20 2a 29 28 26 70   (unsigned *)(&p
132c0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
132d0 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78  nCol]);.  pIndex
132e0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
132f0 75 38 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61  u8 *)(&pIndex->a
13300 69 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29  iRowEst[nCol+1])
13310 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ;.  pIndex->zNam
13320 65 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49  e = (char *)(&pI
13330 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
13340 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72  [nCol]);.  zExtr
13350 61 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49  a = (char *)(&pI
13360 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d  ndex->zName[nNam
13370 65 2b 31 5d 29 3b 0a 20 20 73 74 72 63 70 79 28  e+1]);.  strcpy(
13380 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
13390 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Name);.  pIndex-
133a0 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  >pTable = pTab;.
133b0 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d    pIndex->nColum
133c0 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
133d0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
133e0 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  ror = onError;. 
133f0 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
13400 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20  ex = pName==0;. 
13410 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
13420 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
13430 70 53 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43  pSchema;..  /* C
13440 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
13450 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44  e should honor D
13460 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20  ESC requests on 
13470 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20  index columns.  
13480 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53  */.  if( pDb->pS
13490 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
134a0 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72  at>=4 ){.    sor
134b0 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b  tOrderMask = -1;
134c0 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43     /* Honor DESC
134d0 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
134e0 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
134f0 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65   0;    /* Ignore
13500 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20   DESC */.  }..  
13510 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65  /* Scan the name
13520 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
13530 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
13540 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a   be indexed and.
13550 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f    ** load the co
13560 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74  lumn indices int
13570 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  o the Index stru
13580 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61  cture.  Report a
13590 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20  n error.  ** if 
135a0 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f  any column is no
135b0 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
135c0 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74  for(i=0, pListIt
135d0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
135e0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
135f0 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a  , pListItem++){.
13600 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13610 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74  zColName = pList
13620 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Item->zName;.   
13630 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c   Column *pTabCol
13640 3b 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65 73  ;.    int reques
13650 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  tedSortOrder;.  
13660 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13680 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65   /* Collation se
13690 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a  quence name */..
136a0 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61      for(j=0, pTa
136b0 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  bCol=pTab->aCol;
136c0 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
136d0 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a  ++, pTabCol++){.
136e0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
136f0 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d  3StrICmp(zColNam
13700 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d  e, pTabCol->zNam
13710 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
13720 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d     }.    if( j>=
13730 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
13740 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13750 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
13760 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c  le %s has no col
13770 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20  umn named %s",. 
13780 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
13790 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20  me, zColName);. 
137a0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
137b0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
137c0 20 7d 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20   }.    /* TODO: 
137d0 20 41 64 64 20 61 20 74 65 73 74 20 74 6f 20 6d   Add a test to m
137e0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
137f0 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73  e same column is
13800 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 20 20 2a   not named.    *
13810 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  * more than once
13820 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
13830 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68   index.  Only th
13840 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65  e first instance
13850 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
13860 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20  olumn will ever 
13870 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f  be used by the o
13880 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20  ptimizer.  Note 
13890 74 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20  that using the. 
138a0 20 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d     ** same colum
138b0 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  n more than once
138c0 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72   cannot be an er
138d0 72 6f 72 20 62 65 63 61 75 73 65 20 74 68 61 74  ror because that
138e0 20 77 6f 75 6c 64 20 0a 20 20 20 20 2a 2a 20 62   would .    ** b
138f0 72 65 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63  reak backwards c
13900 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69  ompatibility - i
13910 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20  t needs to be a 
13920 77 61 72 6e 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  warning..    */.
13930 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
13940 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20  lumn[i] = j;.   
13950 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e   if( pListItem->
13960 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61  pExpr ){.      a
13970 73 73 65 72 74 28 20 70 4c 69 73 74 49 74 65 6d  ssert( pListItem
13980 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29  ->pExpr->pColl )
13990 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
139a0 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20 73 74  zExtra;.      st
139b0 72 63 70 79 28 7a 45 78 74 72 61 2c 20 70 4c 69  rcpy(zExtra, pLi
139c0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70  stItem->pExpr->p
139d0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
139e0 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 28 73      zExtra += (s
139f0 74 72 6c 65 6e 28 7a 43 6f 6c 6c 29 20 2b 20 31  trlen(zColl) + 1
13a00 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13a10 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62      zColl = pTab
13a20 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[j].zColl;
13a30 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  .      if( !zCol
13a40 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  l ){.        zCo
13a50 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
13a60 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
13a70 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
13a80 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
13a90 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74  && !sqlite3Locat
13aa0 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
13ab0 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20   zColl, -1) ){. 
13ac0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
13ad0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13ae0 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
13af0 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c  zColl[i] = zColl
13b00 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53  ;.    requestedS
13b10 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
13b20 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
13b30 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b  & sortOrderMask;
13b40 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f  .    pIndex->aSo
13b50 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 72 65 71  rtOrder[i] = req
13b60 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
13b70 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
13b80 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64  faultRowEst(pInd
13b90 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  ex);..  if( pTab
13ba0 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
13bb0 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
13bc0 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
13bd0 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
13be0 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
13bf0 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
13c00 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
13c10 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
13c20 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
13c30 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
13c40 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
13c50 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
13c60 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
13c70 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
13c80 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
13c90 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
13ca0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
13cb0 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
13cc0 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
13cd0 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
13ce0 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
13cf0 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
13d00 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
13d10 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
13d20 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
13d30 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
13d40 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
13d50 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
13d60 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
13d70 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
13d80 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
13d90 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
13da0 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
13db0 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
13dc0 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
13dd0 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
13de0 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
13df0 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
13e00 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
13e10 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
13e20 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
13e30 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
13e40 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
13e50 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72  sert( pIdx->onEr
13e60 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
13e70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
13e80 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b  dx->autoIndex );
13e90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13ea0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
13eb0 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20  OE_None );..    
13ec0 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
13ed0 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  umn!=pIndex->nCo
13ee0 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
13ef0 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  .      for(k=0; 
13f00 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  k<pIdx->nColumn;
13f10 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   k++){.        c
13f20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 20 3d 20  onst char *z1 = 
13f30 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  pIdx->azColl[k];
13f40 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
13f50 68 61 72 20 2a 7a 32 20 3d 20 70 49 6e 64 65 78  har *z2 = pIndex
13f60 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
13f70 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
13f80 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64  iColumn[k]!=pInd
13f90 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20  ex->aiColumn[k] 
13fa0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
13fb0 20 69 66 28 20 70 49 64 78 2d 3e 61 53 6f 72 74   if( pIdx->aSort
13fc0 4f 72 64 65 72 5b 6b 5d 21 3d 70 49 6e 64 65 78  Order[k]!=pIndex
13fd0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 20  ->aSortOrder[k] 
13fe0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
13ff0 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20 73   if( z1!=z2 && s
14000 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
14010 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20  , z2) ) break;. 
14020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14030 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   k==pIdx->nColum
14040 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  n ){.        if(
14050 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
14060 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
14070 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
14080 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  This constraint 
14090 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65  creates the same
140a0 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76   index as a prev
140b0 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
140c0 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65  * constraint spe
140d0 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65  cified somewhere
140e0 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
140f0 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
14100 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77            ** How
14110 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46  ever the ON CONF
14120 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65  LICT clauses are
14130 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62   different. If b
14140 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20  oth this .      
14150 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
14160 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  t and the previo
14170 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  us equivalent co
14180 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78  nstraint have ex
14190 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20  plicit.         
141a0 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   ** ON CONFLICT 
141b0 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20  clauses this is 
141c0 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77  an error. Otherw
141d0 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20  ise, use the.   
141e0 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63         ** explic
141f0 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62  itly specified b
14200 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65  ehaviour for the
14210 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
14220 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
14230 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72  f( !(pIdx->onErr
14240 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c  or==OE_Default |
14250 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  | pIndex->onErro
14260 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29  r==OE_Default) )
14270 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
14280 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14290 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
142a0 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74         "conflict
142b0 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ing ON CONFLICT 
142c0 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65  clauses specifie
142d0 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  d", 0);.        
142e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
142f0 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
14300 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
14310 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
14320 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65  >onError = pInde
14330 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  x->onError;.    
14340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14350 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
14360 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14380 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
14390 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72  he new Index str
143a0 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61  ucture to its ta
143b0 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f  ble and to the o
143c0 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d  ther.  ** in-mem
143d0 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
143e0 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20  uctures. .  */. 
143f0 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
14400 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  sy ){.    Index 
14410 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  *p;.    p = sqli
14420 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
14430 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e  Index->pSchema->
14440 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20  idxHash, .      
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14460 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
14470 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d  , strlen(pIndex-
14480 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65  >zName)+1, pInde
14490 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  x);.    if( p ){
144a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
144b0 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20  ==pIndex );  /* 
144c0 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
144d0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
144e0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
144f0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
14500 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
14510 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
14520 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54  nges;.    if( pT
14530 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
14540 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
14550 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
14560 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  um;.    }.  }.. 
14570 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
14580 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68  nit.busy is 0 th
14590 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e  en create the in
145a0 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68  dex on disk.  Th
145b0 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73  is.  ** involves
145c0 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64   writing the ind
145d0 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74  ex into the mast
145e0 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c  er table and fil
145f0 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a  ling in the.  **
14600 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
14610 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f  current table co
14620 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ntents..  **.  *
14630 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  * The db->init.b
14640 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68  usy is 0 when th
14650 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74  e user first ent
14660 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44  ers a CREATE IND
14670 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  EX .  ** command
14680 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  .  db->init.busy
14690 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74   is 1 when a dat
146a0 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
146b0 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45  and .  ** CREATE
146c0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
146d0 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f  s are read out o
146e0 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  f the master tab
146f0 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65  le.  In.  ** the
14700 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65   latter case the
14710 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
14720 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77  xists on disk, w
14730 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a  hich is why.  **
14740 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
14750 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20  o recreate it.. 
14760 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c   **.  ** If pTbl
14770 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
14780 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
14790 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72  enerated as a pr
147a0 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f  imary key.  ** o
147b0 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
147c0 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20  int of a CREATE 
147d0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
147e0 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
147f0 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
14800 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
14810 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
14820 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
14830 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
14840 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
14850 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
14860 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69  else if( db->ini
14870 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
14880 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
14890 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69  ar *zStmt;.    i
148a0 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  nt iMem = pParse
148b0 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76  ->nMem++;..    v
148c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
148d0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
148e0 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65  f( v==0 ) goto e
148f0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14900 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  ;...    /* Creat
14910 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  e the rootpage f
14920 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  or the index.   
14930 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
14940 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
14950 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
14960 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
14970 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
14980 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c  reateIndex, iDb,
14990 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
149a0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
149b0 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20  MemStore, iMem, 
149c0 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68  0);..    /* Gath
149d0 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  er the complete 
149e0 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
149f0 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
14a00 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74  nt into.    ** t
14a10 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c  he zStmt variabl
14a20 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
14a30 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20   pStart && pEnd 
14a40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61  ){.      /* A na
14a50 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61  med index with a
14a60 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54  n explicit CREAT
14a70 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
14a80 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74  t */.      zStmt
14a90 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
14aa0 66 28 22 43 52 45 41 54 45 25 73 20 49 4e 44 45  f("CREATE%s INDE
14ab0 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20  X %.*s",.       
14ac0 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e   onError==OE_Non
14ad0 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55  e ? "" : " UNIQU
14ae0 45 22 2c 0a 20 20 20 20 20 20 20 20 70 45 6e 64  E",.        pEnd
14af0 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b  ->z - pName->z +
14b00 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d   1,.        pNam
14b10 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e->z);.    }else
14b20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75  {.      /* An au
14b30 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72  tomatic index cr
14b40 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41  eated by a PRIMA
14b50 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
14b60 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
14b70 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20       /* zStmt = 
14b80 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
14b90 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  "); */.      zSt
14ba0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  mt = 0;.    }.. 
14bb0 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74     /* Add an ent
14bc0 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73  ry in sqlite_mas
14bd0 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ter for this ind
14be0 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ex.    */.    sq
14bf0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
14c00 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
14c10 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25    "INSERT INTO %
14c20 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64  Q.%s VALUES('ind
14c30 65 78 27 2c 25 51 2c 25 51 2c 23 30 2c 25 51 29  ex',%Q,%Q,#0,%Q)
14c40 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  ;",.        db->
14c50 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
14c60 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
14c70 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ),.        pInde
14c80 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  x->zName,.      
14c90 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
14ca0 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20         zStmt.   
14cb0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
14cc0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
14cd0 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  op, 1, 0);.    s
14ce0 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29  qliteFree(zStmt)
14cf0 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74  ;..    /* Fill t
14d00 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61  he index with da
14d10 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74  ta and reparse t
14d20 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20  he schema. Code 
14d30 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20  an OP_Expire.   
14d40 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74   ** to invalidat
14d50 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c  e all pre-compil
14d60 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
14d70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
14d80 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
14d90 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
14da0 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
14db0 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
14dc0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
14dd0 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
14de0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14df0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73  beOp3(v, OP_Pars
14e00 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
14e10 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
14e20 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65 3d 27  3MPrintf("name='
14e30 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  %q'", pIndex->zN
14e40 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43  ame), P3_DYNAMIC
14e50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14e60 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14e70 45 78 70 69 72 65 2c 20 30 2c 20 30 29 3b 0a 20  Expire, 0, 0);. 
14e80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
14e90 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e  hen adding an in
14ea0 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20  dex to the list 
14eb0 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61  of indices for a
14ec0 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a   table, make.  *
14ed0 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63  * sure all indic
14ee0 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65  es labeled OE_Re
14ef0 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72  place come after
14f00 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c   all those label
14f10 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72  ed.  ** OE_Ignor
14f20 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
14f30 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f  ssary for the co
14f40 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
14f50 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61  of UPDATE.  ** a
14f60 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a  nd INSERT..  */.
14f70 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
14f80 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d  usy || pTblName=
14f90 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e  =0 ){.    if( on
14fa0 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
14fb0 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
14fc0 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  x==0.         ||
14fd0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
14fe0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
14ff0 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  ce){.      pInde
15000 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
15010 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70  >pIndex;.      p
15020 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
15030 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
15040 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  .      Index *pO
15050 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
15060 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
15070 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
15080 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
15090 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
150a0 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  place ){.       
150b0 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
150c0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
150d0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
150e0 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
150f0 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68  Next;.      pOth
15100 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
15110 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
15120 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ndex = 0;.  }.. 
15130 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
15140 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
15150 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
15160 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  :.  if( pIndex )
15170 7b 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28  {.    freeIndex(
15180 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73  pIndex);.  }.  s
15190 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
151a0 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73  lete(pList);.  s
151b0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
151c0 65 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  ete(pTblName);. 
151d0 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
151e0 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
151f0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
15200 63 6f 64 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  code to make sur
15210 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  e the file forma
15220 74 20 6e 75 6d 62 65 72 20 69 73 20 61 74 20 6c  t number is at l
15230 65 61 73 74 20 6d 69 6e 46 6f 72 6d 61 74 2e 0a  east minFormat..
15240 2a 2a 20 54 68 65 20 67 65 6e 65 72 61 74 65 64  ** The generated
15250 20 63 6f 64 65 20 77 69 6c 6c 20 69 6e 63 72 65   code will incre
15260 61 73 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72  ase the file for
15270 6d 61 74 20 6e 75 6d 62 65 72 20 69 66 20 6e 65  mat number if ne
15280 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 76 6f 69 64  cessary..*/.void
15290 20 73 71 6c 69 74 65 33 4d 69 6e 69 6d 75 6d 46   sqlite3MinimumF
152a0 69 6c 65 46 6f 72 6d 61 74 28 50 61 72 73 65 20  ileFormat(Parse 
152b0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
152c0 2c 20 69 6e 74 20 6d 69 6e 46 6f 72 6d 61 74 29  , int minFormat)
152d0 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 76  {.  Vdbe *v;.  v
152e0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
152f0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
15300 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
15310 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15320 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
15330 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
15340 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15350 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72  _Integer, minFor
15360 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  mat, 0);.    sql
15370 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15380 20 4f 50 5f 47 65 2c 20 30 2c 20 73 71 6c 69 74   OP_Ge, 0, sqlit
15390 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
153a0 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c  r(v)+3);.    sql
153b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
153c0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e   OP_Integer, min
153d0 46 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20  Format, 0);.    
153e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
153f0 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
15400 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 7d 0a 7d  , iDb, 1);.  }.}
15410 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65  ../*.** Fill the
15420 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b   Index.aiRowEst[
15430 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66  ] array with def
15440 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ault information
15450 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a   - information.*
15460 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65  * to be used whe
15470 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75  n we have not ru
15480 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f  n the ANALYZE co
15490 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52  mmand..**.** aiR
154a0 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70  owEst[0] is supp
154b0 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ose to contain t
154c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
154d0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64  ments in the ind
154e0 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20  ex..** Since we 
154f0 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65  do not know, gue
15500 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61  ss 1 million.  a
15510 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e  iRowEst[1] is an
15520 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
15530 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
15540 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
15550 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
15560 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20  articular value 
15570 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  of the.** first 
15580 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
15590 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32  dex.  aiRowEst[2
155a0 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
155b0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a   of the number.*
155c0 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d  * of rows that m
155d0 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
155e0 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e  lar combiniation
155f0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20   of the first 2 
15600 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68  columns.** of th
15610 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f  e index.  And so
15620 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74   forth.  It must
15630 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63   always be the c
15640 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20  ase that.*.**   
15650 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
15660 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d  [N]<=aiRowEst[N-
15670 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  1].**           
15680 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a  aiRowEst[N]>=1.*
15690 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20  *.** Apart from 
156a0 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69  that, we have li
156b0 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65  ttle to go on be
156c0 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20  sides intuition 
156d0 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52  as to.** how aiR
156e0 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62  owEst[] should b
156f0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  e initialized.  
15700 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65  The numbers gene
15710 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72  rated here.** ar
15720 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63  e based on typic
15730 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20  al values found 
15740 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65  in actual indice
15750 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
15760 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28  e3DefaultRowEst(
15770 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
15780 75 6e 73 69 67 6e 65 64 20 2a 61 20 3d 20 70 49  unsigned *a = pI
15790 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20  dx->aiRowEst;.  
157a0 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
157b0 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20   a!=0 );.  a[0] 
157c0 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 66 6f 72  = 1000000;.  for
157d0 28 69 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  (i=pIdx->nColumn
157e0 3b 20 69 3e 3d 35 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=5; i--){.  
157f0 20 20 61 5b 69 5d 20 3d 20 35 3b 0a 20 20 7d 0a    a[i] = 5;.  }.
15800 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 29 7b    while( i>=1 ){
15810 0a 20 20 20 20 61 5b 69 5d 20 3d 20 31 31 20 2d  .    a[i] = 11 -
15820 20 69 3b 0a 20 20 20 20 69 2d 2d 3b 0a 20 20 7d   i;.    i--;.  }
15830 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45  .  if( pIdx->onE
15840 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror!=OE_None ){
15850 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43 6f  .    a[pIdx->nCo
15860 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d  lumn] = 1;.  }.}
15870 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15880 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61  tine will drop a
15890 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64  n existing named
158a0 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f   index.  This ro
158b0 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  utine.** impleme
158c0 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44  nts the DROP IND
158d0 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  EX statement..*/
158e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
158f0 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
15900 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
15910 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73  Name, int ifExis
15920 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ts){.  Index *pI
15930 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ndex;.  Vdbe *v;
15940 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
15950 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
15960 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70  nt iDb;..  if( p
15970 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
15980 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
15990 65 64 28 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ed() ){.    goto
159a0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
159b0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
159c0 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
159d0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
159e0 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
159f0 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
15a00 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
15a10 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
15a20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
15a30 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e  FindIndex(db, pN
15a40 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
15a50 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
15a60 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
15a70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
15a80 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b  if( !ifExists ){
15a90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
15aa0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15ab0 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
15ac0 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20  S", pName, 0);. 
15ad0 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
15ae0 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
15af0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
15b00 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
15b10 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75    if( pIndex->au
15b20 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73  toIndex ){.    s
15b30 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15b40 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73  Parse, "index as
15b50 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
15b60 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
15b70 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
15b80 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
15b90 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
15ba0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
15bb0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
15bc0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
15bd0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
15be0 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
15bf0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15c00 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
15c10 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
15c20 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
15c30 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
15c40 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
15c50 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
15c60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
15c70 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
15c80 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
15c90 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
15ca0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
15cb0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
15cc0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
15cd0 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
15ce0 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
15cf0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
15d00 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
15d10 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
15d20 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20  TEMPDB && iDb ) 
15d30 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
15d40 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
15d50 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
15d60 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
15d70 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
15d80 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
15d90 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
15da0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
15db0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
15dc0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
15dd0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
15de0 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
15df0 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
15e00 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
15e10 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
15e20 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
15e30 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
15e40 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
15e50 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45  se,.       "DELE
15e60 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
15e70 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20  ERE name=%Q",.  
15e80 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
15e90 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
15ea0 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
15eb0 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
15ec0 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
15ed0 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
15ee0 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20  db, v, iDb);.   
15ef0 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
15f00 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d  (pParse, pIndex-
15f10 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
15f20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
15f30 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c  v, OP_DropIndex,
15f40 20 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d   iDb, 0, pIndex-
15f50 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
15f60 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78  .exit_drop_index
15f70 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
15f80 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b  stDelete(pName);
15f90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79  .}../*.** pArray
15fa0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
15fb0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a   an array of obj
15fc0 65 63 74 73 2e 20 20 45 61 63 68 20 6f 62 6a 65  ects.  Each obje
15fd0 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72  ct in the.** arr
15fe0 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79  ay is szEntry by
15ff0 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 20 54 68  tes in size.  Th
16000 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
16010 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6f 62  ates a new.** ob
16020 6a 65 63 74 20 6f 6e 20 74 68 65 20 65 6e 64 20  ject on the end 
16030 6f 66 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a  of the array..**
16040 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79 20 69 73 20  .** *pnEntry is 
16050 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
16060 74 72 69 65 73 20 61 6c 72 65 61 64 79 20 69 6e  tries already in
16070 20 75 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20   use.  *pnAlloc 
16080 69 73 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f  is.** the previo
16090 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73  usly allocated s
160a0 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
160b0 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20 74  .  initSize is t
160c0 68 65 0a 2a 2a 20 73 75 67 67 65 73 74 65 64 20  he.** suggested 
160d0 69 6e 69 74 69 61 6c 20 61 72 72 61 79 20 73 69  initial array si
160e0 7a 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ze allocation..*
160f0 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 6f  *.** The index o
16100 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  f the new entry 
16110 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 2a  is returned in *
16120 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  pIdx..**.** This
16130 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
16140 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
16150 65 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  e array of objec
16160 74 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 69 67  ts.  This.** mig
16170 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ht be the same a
16180 73 20 74 68 65 20 70 41 72 72 61 79 20 70 61 72  s the pArray par
16190 61 6d 65 74 65 72 20 6f 72 20 69 74 20 6d 69 67  ameter or it mig
161a0 68 74 20 62 65 20 61 20 64 69 66 66 65 72 65 6e  ht be a differen
161b0 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 66 20  t.** pointer if 
161c0 74 68 65 20 61 72 72 61 79 20 77 61 73 20 72 65  the array was re
161d0 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  sized..*/.void *
161e0 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
161f0 63 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 41  cate(.  void *pA
16200 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72  rray,     /* Arr
16210 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
16220 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63  Might be realloc
16230 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ated */.  int sz
16240 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53  Entry,      /* S
16250 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65  ize of each obje
16260 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ct in the array 
16270 2a 2f 0a 20 20 69 6e 74 20 69 6e 69 74 53 69 7a  */.  int initSiz
16280 65 2c 20 20 20 20 20 2f 2a 20 53 75 67 67 65 73  e,     /* Sugges
16290 74 65 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f  ted initial allo
162a0 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65  cation, in eleme
162b0 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  nts */.  int *pn
162c0 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75  Entry,     /* Nu
162d0 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
162e0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
162f0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c 6c   */.  int *pnAll
16300 6f 63 2c 20 20 20 20 20 2f 2a 20 43 75 72 72 65  oc,     /* Curre
16310 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  nt size of the a
16320 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c  llocation, in el
16330 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ements */.  int 
16340 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a  *pIdx         /*
16350 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78   Write the index
16360 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68   of a new slot h
16370 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ere */.){.  char
16380 20 2a 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45 6e   *z;.  if( *pnEn
16390 74 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63 20  try >= *pnAlloc 
163a0 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65  ){.    void *pNe
163b0 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53 69  w;.    int newSi
163c0 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  ze;.    newSize 
163d0 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20 2b  = (*pnAlloc)*2 +
163e0 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20 70   initSize;.    p
163f0 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
16400 6c 6f 63 28 70 41 72 72 61 79 2c 20 6e 65 77 53  loc(pArray, newS
16410 69 7a 65 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20  ize*szEntry);.  
16420 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
16430 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d  .      *pIdx = -
16440 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
16450 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20  pArray;.    }.  
16460 20 20 2a 70 6e 41 6c 6c 6f 63 20 3d 20 6e 65 77    *pnAlloc = new
16470 53 69 7a 65 3b 0a 20 20 20 20 70 41 72 72 61 79  Size;.    pArray
16480 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a   = pNew;.  }.  z
16490 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79   = (char*)pArray
164a0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 2a 70  ;.  memset(&z[*p
164b0 6e 45 6e 74 72 79 20 2a 20 73 7a 45 6e 74 72 79  nEntry * szEntry
164c0 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a  ], 0, szEntry);.
164d0 20 20 2a 70 49 64 78 20 3d 20 2a 70 6e 45 6e 74    *pIdx = *pnEnt
164e0 72 79 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79  ry;.  ++*pnEntry
164f0 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61  ;.  return pArra
16500 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  y;.}../*.** Appe
16510 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  nd a new element
16520 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64   to the given Id
16530 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
16540 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a  new IdList if.**
16550 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20   need be..**.** 
16560 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20  A new IdList is 
16570 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
16580 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
16590 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a  ils..*/.IdList *
165a0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
165b0 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  end(IdList *pLis
165c0 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
165d0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
165e0 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
165f0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
16600 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
16610 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
16620 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
16630 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
16640 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ->nAlloc = 0;.  
16650 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73  }.  pList->a = s
16660 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
16670 61 74 65 28 0a 20 20 20 20 20 20 70 4c 69 73 74  ate(.      pList
16680 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f  ->a,.      sizeo
16690 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a  f(pList->a[0]),.
166a0 20 20 20 20 20 20 35 2c 0a 20 20 20 20 20 20 26        5,.      &
166b0 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20  pList->nId,.    
166c0 20 20 26 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63    &pList->nAlloc
166d0 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  ,.      &i.  );.
166e0 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
166f0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
16700 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
16710 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
16720 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
16730 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
16740 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e  FromToken(pToken
16750 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  );.  return pLis
16760 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  t;.}../*.** Dele
16770 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f  te an IdList..*/
16780 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c  .void sqlite3IdL
16790 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74  istDelete(IdList
167a0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
167b0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
167c0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
167d0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
167e0 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
167f0 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
16800 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
16810 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
16820 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
16830 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
16840 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
16850 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
16860 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
16870 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
16880 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
16890 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
168a0 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
168b0 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
168c0 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
168d0 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
168e0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
168f0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
16900 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
16910 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
16920 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
16930 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
16940 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
16950 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
16960 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
16970 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
16980 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  ew table name to
16990 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
169a0 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
169b0 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20  w SrcList if.** 
169c0 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20  need be.  A new 
169d0 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
169e0 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
169f0 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69  even if pToken i
16a00 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  s NULL..**.** A 
16a10 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73 20 72  new SrcList is r
16a20 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
16a30 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
16a40 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61  ls..**.** If pDa
16a50 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75  tabase is not nu
16a60 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ll, it means tha
16a70 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  t the table has 
16a80 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64  an optional.** d
16a90 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65  atabase name pre
16aa0 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  fix.  Like this:
16ab0 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c    "database.tabl
16ac0 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61  e".  The pDataba
16ad0 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  se.** points to 
16ae0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
16af0 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f  nd the pTable po
16b00 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61  ints to the data
16b10 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68  base name..** Th
16b20 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e  e SrcList.a[].zN
16b30 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c  ame field is fil
16b40 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  led with the tab
16b50 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69  le name which mi
16b60 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d  ght.** come from
16b70 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74   pTable (if pDat
16b80 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f  abase is NULL) o
16b90 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65  r from pDatabase
16ba0 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61  .  .** SrcList.a
16bb0 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20  [].zDatabase is 
16bc0 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
16bd0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72  database name fr
16be0 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72  om pTable,.** or
16bf0 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f   with NULL if no
16c00 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65   database is spe
16c10 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  cified..**.** In
16c20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
16c30 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a   call like this:
16c40 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
16c50 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
16c60 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a  end(A,B,0);.**.*
16c70 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61  * Then B is a ta
16c80 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
16c90 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
16ca0 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20  s unspecified.  
16cb0 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b  If called.** lik
16cc0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
16cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
16ce0 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43  ListAppend(A,B,C
16cf0 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20  );.**.** Then C 
16d00 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  is the table nam
16d10 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64  e and B is the d
16d20 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f  atabase name..*/
16d30 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
16d40 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53  3SrcListAppend(S
16d50 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  rcList *pList, T
16d60 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f  oken *pTable, To
16d70 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b  ken *pDatabase){
16d80 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
16d90 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
16da0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
16db0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
16dc0 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
16dd0 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20  f(SrcList) );.  
16de0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
16df0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
16e00 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31  List->nAlloc = 1
16e10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
16e20 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e  t->nSrc>=pList->
16e30 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72  nAlloc ){.    Sr
16e40 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20  cList *pNew;.   
16e50 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a   pList->nAlloc *
16e60 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  = 2;.    pNew = 
16e70 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
16e80 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ist,.           
16e90 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73      sizeof(*pLis
16ea0 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c  t) + (pList->nAl
16eb0 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c  loc-1)*sizeof(pL
16ec0 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  ist->a[0]) );.  
16ed0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
16ee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72  .      sqlite3Sr
16ef0 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  cListDelete(pLis
16f00 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
16f10 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c   0;.    }.    pL
16f20 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
16f30 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
16f40 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d  ->a[pList->nSrc]
16f50 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d  ;.  memset(pItem
16f60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  , 0, sizeof(pLis
16f70 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28  t->a[0]));.  if(
16f80 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44   pDatabase && pD
16f90 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b  atabase->z==0 ){
16fa0 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
16fb0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   0;.  }.  if( pD
16fc0 61 74 61 62 61 73 65 20 26 26 20 70 54 61 62 6c  atabase && pTabl
16fd0 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  e ){.    Token *
16fe0 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73  pTemp = pDatabas
16ff0 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  e;.    pDatabase
17000 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70   = pTable;.    p
17010 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20  Table = pTemp;. 
17020 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   }.  pItem->zNam
17030 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
17040 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29  romToken(pTable)
17050 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  ;.  pItem->zData
17060 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  base = sqlite3Na
17070 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74  meFromToken(pDat
17080 61 62 61 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d  abase);.  pItem-
17090 3e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  >iCursor = -1;. 
170a0 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61   pItem->isPopula
170b0 74 65 64 20 3d 20 30 3b 0a 20 20 70 4c 69 73 74  ted = 0;.  pList
170c0 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75  ->nSrc++;.  retu
170d0 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
170e0 2a 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72  ** Assign cursor
170f0 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20  s to all tables 
17100 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a  in a SrcList.*/.
17110 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
17120 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
17130 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
17140 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
17150 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
17160 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
17170 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74  *pItem;.  assert
17180 28 70 4c 69 73 74 20 7c 7c 20 73 71 6c 69 74 65  (pList || sqlite
17190 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
171a0 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
171b0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  {.    for(i=0, p
171c0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
171d0 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
171e0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
171f0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43     if( pItem->iC
17200 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b  ursor>=0 ) break
17210 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69  ;.      pItem->i
17220 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
17230 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69  >nTab++;.      i
17240 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
17250 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
17260 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
17270 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
17280 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
17290 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  >pSrc);.      }.
172a0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
172b0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
172c0 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
172d0 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
172e0 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
172f0 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
17300 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74  stDelete(SrcList
17310 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
17320 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
17330 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
17340 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
17350 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
17360 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
17370 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
17380 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
17390 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
173a0 65 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  e(pItem->zDataba
173b0 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  se);.    sqliteF
173c0 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  ree(pItem->zName
173d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
173e0 65 28 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  e(pItem->zAlias)
173f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
17400 65 74 65 54 61 62 6c 65 28 70 49 74 65 6d 2d 3e  eteTable(pItem->
17410 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
17420 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
17430 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
17440 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
17450 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 4f 6e  elete(pItem->pOn
17460 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  );.    sqlite3Id
17470 4c 69 73 74 44 65 6c 65 74 65 28 70 49 74 65 6d  ListDelete(pItem
17480 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20  ->pUsing);.  }. 
17490 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
174a0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
174b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
174c0 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
174d0 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74  r to add a new t
174e0 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  erm to the.** en
174f0 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46  d of a growing F
17500 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ROM clause.  The
17510 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
17520 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a  s the part of.**
17530 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
17540 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
17550 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  y been construct
17560 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c  ed.  "p" is NULL
17570 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
17580 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66  he first term of
17590 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
175a0 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  .  pTable and pD
175b0 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74  atabase.** are t
175c0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
175d0 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73  able and databas
175e0 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
175f0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ROM clause term.
17600 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73  .** pDatabase is
17610 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74   NULL if the dat
17620 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69  abase name quali
17630 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  fier is missing 
17640 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63  - the.** usual c
17650 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72  ase.  If the ter
17660 6d 20 68 61 73 20 61 20 61 6c 69 61 73 2c 20 74  m has a alias, t
17670 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74  hen pAlias point
17680 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61  s to the.** alia
17690 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65  s token.  If the
176a0 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75   term is a subqu
176b0 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75  ery, then pSubqu
176c0 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45  ery is the.** SE
176d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
176e0 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79  hat the subquery
176f0 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70   encodes.  The p
17700 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61  Table and.** pDa
17710 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72  tabase parameter
17720 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73  s are NULL for s
17730 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20  ubqueries.  The 
17740 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a  pOn and pUsing.*
17750 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  * parameters are
17760 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
17770 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
17780 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
17790 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63  Return a new Src
177a0 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64  List which encod
177b0 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77  es is the FROM w
177c0 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74  ith the new.** t
177d0 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72  erm added..*/.Sr
177e0 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
177f0 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
17800 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  erm(.  SrcList *
17810 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
17820 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20  * The left part 
17830 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
17840 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20  se already seen 
17850 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
17860 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
17870 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
17880 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  e to add to the 
17890 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
178a0 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
178b0 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e,       /* Name
178c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
178d0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62   containing pTab
178e0 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
178f0 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20  Alias,          
17900 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  /* The right-han
17910 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53  d side of the AS
17920 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a   subexpression *
17930 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
17940 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41  query,      /* A
17950 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69   subquery used i
17960 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62  n place of a tab
17970 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70  le name */.  Exp
17980 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20  r *pOn,         
17990 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63       /* The ON c
179a0 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
179b0 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73  */.  IdList *pUs
179c0 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ing          /* 
179d0 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  The USING clause
179e0 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b   of a join */.){
179f0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
17a00 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
17a10 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c   p = sqlite3SrcL
17a20 69 73 74 41 70 70 65 6e 64 28 70 2c 20 70 54 61  istAppend(p, pTa
17a30 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b  ble, pDatabase);
17a40 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
17a50 2d 3e 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ->nSrc==0 ){.   
17a60 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
17a70 74 65 28 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  te(pOn);.    sql
17a80 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
17a90 28 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 73 71  (pUsing);.    sq
17aa0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
17ab0 65 28 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20  e(pSubquery);.  
17ac0 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a    return p;.  }.
17ad0 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
17ae0 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66  p->nSrc-1];.  if
17af0 28 20 70 41 6c 69 61 73 20 26 26 20 70 41 6c 69  ( pAlias && pAli
17b00 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74  as->n ){.    pIt
17b10 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
17b20 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
17b30 6e 28 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20  n(pAlias);.  }. 
17b40 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
17b50 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70  = pSubquery;.  p
17b60 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b  Item->pOn = pOn;
17b70 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  .  pItem->pUsing
17b80 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74   = pUsing;.  ret
17b90 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
17ba0 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70  When building up
17bb0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69   a FROM clause i
17bc0 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68  n the parser, th
17bd0 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a  e join operator.
17be0 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  ** is initially 
17bf0 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
17c00 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42  left operand.  B
17c10 75 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  ut the code gene
17c20 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73  rator.** expects
17c30 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   the join operat
17c40 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20  or to be on the 
17c50 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20  right operand.  
17c60 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
17c70 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20  Shifts all join 
17c80 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c  operators from l
17c90 65 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72  eft to right for
17ca0 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a   an entire FROM.
17cb0 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  ** clause..**.**
17cc0 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73   Example: Suppos
17cd0 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69  e the join is li
17ce0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
17cf0 20 20 20 20 20 20 20 20 20 41 20 6e 61 74 75 72           A natur
17d00 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a  al cross join B.
17d10 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74  **.** The operat
17d20 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63  or is "natural c
17d30 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65  ross join".  The
17d40 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64   A and B operand
17d50 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20  s are stored.** 
17d60 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70  in p->a[0] and p
17d70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69  ->a[1], respecti
17d80 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65  vely.  The parse
17d90 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72  r initially stor
17da0 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  es the.** operat
17db0 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68 69 73  or with A.  This
17dc0 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20   routine shifts 
17dd0 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76  that operator ov
17de0 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64  er to B..*/.void
17df0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53   sqlite3SrcListS
17e00 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63  hiftJoinType(Src
17e10 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  List *p){.  if( 
17e20 70 20 26 26 20 70 2d 3e 61 20 29 7b 0a 20 20 20  p && p->a ){.   
17e30 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
17e40 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30  i=p->nSrc-1; i>0
17e50 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
17e60 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  >a[i].jointype =
17e70 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74   p->a[i-1].joint
17e80 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ype;.    }.    p
17e90 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20  ->a[0].jointype 
17ea0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
17eb0 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61  * Begin a transa
17ec0 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
17ed0 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61  lite3BeginTransa
17ee0 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
17ef0 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a  rse, int type){.
17f00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
17f10 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
17f20 69 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  i;..  if( pParse
17f30 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
17f40 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
17f50 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
17f60 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
17f70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
17f80 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
17f90 65 64 28 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ed() ) return;. 
17fa0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
17fb0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
17fc0 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
17fd0 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29  , "BEGIN", 0, 0)
17fe0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20   ) return;..  v 
17ff0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
18000 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
18010 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  !v ) return;.  i
18020 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45  f( type!=TK_DEFE
18030 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28  RRED ){.    for(
18040 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
18050 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
18060 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18070 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
18080 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43  i, (type==TK_EXC
18090 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20  LUSIVE)+1);.    
180a0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
180b0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
180c0 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29  utoCommit, 0, 0)
180d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
180e0 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  t a transaction.
180f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
18100 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e  ommitTransaction
18110 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
18120 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
18130 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66    Vdbe *v;..  if
18140 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
18150 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
18160 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
18170 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
18180 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
18190 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61  Err || sqlite3Ma
181a0 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20 72  llocFailed() ) r
181b0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
181c0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
181d0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
181e0 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49  NSACTION, "COMMI
181f0 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  T", 0, 0) ) retu
18200 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  rn;..  v = sqlit
18210 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
18220 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
18230 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18240 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  Op(v, OP_AutoCom
18250 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  mit, 1, 0);.  }.
18260 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
18270 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  k a transaction.
18280 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
18290 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69  ollbackTransacti
182a0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
182b0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
182c0 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
182d0 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
182e0 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
182f0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
18300 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
18310 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
18320 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
18330 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
18340 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
18350 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
18360 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
18370 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c  RANSACTION, "ROL
18380 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20  LBACK", 0, 0) ) 
18390 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
183a0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
183b0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
183c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
183d0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74  eAddOp(v, OP_Aut
183e0 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a  oCommit, 1, 1);.
183f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
18400 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20  e sure the TEMP 
18410 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
18420 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66   and available f
18430 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a  or use.  Return.
18440 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
18450 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20   errors.  Leave 
18460 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
18470 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  es in the pParse
18480 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
18490 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65  nt sqlite3OpenTe
184a0 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65  mpDatabase(Parse
184b0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
184c0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
184d0 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
184e0 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26  >aDb[1].pBt==0 &
184f0 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  & !pParse->expla
18500 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  in ){.    int rc
18510 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46   = sqlite3BtreeF
18520 61 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c  actory(db, 0, 0,
18530 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d   MAX_PAGES, &db-
18540 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[1].pBt);.  
18550 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18560 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
18570 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18580 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
18590 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
185a0 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20   database ".    
185b0 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74      "file for st
185c0 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  oring temporary 
185d0 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20  tables");.      
185e0 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
185f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
18600 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
18610 62 2d 3e 66 6c 61 67 73 20 26 20 21 64 62 2d 3e  b->flags & !db->
18620 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
18630 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18640 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
18650 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c 20  db->aDb[1].pBt, 
18660 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
18670 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18680 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
18690 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
186a0 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20  unable to get a 
186b0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a  write lock on ".
186c0 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20 74            "the t
186d0 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
186e0 65 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20 20  e file");.      
186f0 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72    pParse->rc = r
18700 63 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  c;.        retur
18710 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
18720 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 64   }.    assert( d
18730 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
18740 61 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  a );.  }.  retur
18750 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
18760 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
18770 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66   that will verif
18780 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
18790 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a  kie and start.**
187a0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
187b0 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65  ion for all name
187c0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  d database files
187d0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d  ..**.** It is im
187e0 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c  portant that all
187f0 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20   schema cookies 
18800 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64 20  be verified and 
18810 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e  all.** read tran
18820 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61 72  sactions be star
18830 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74 68  ted before anyth
18840 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e 73  ing else happens
18850 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45 20   in.** the VDBE 
18860 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74 68  program.  But th
18870 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
18880 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 6d  e called after m
18890 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64  uch other.** cod
188a0 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65 72  e has been gener
188b0 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20 69  ated.  So here i
188c0 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a  s what we do:.**
188d0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
188e0 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
188f0 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f  is called, we co
18900 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74 68  de an OP_Goto th
18910 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20  at.** will jump 
18920 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  to a subroutine 
18930 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
18940 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e  e program.  Then
18950 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76   we.** record ev
18960 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61  ery database tha
18970 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68 65  t needs its sche
18980 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20 74  ma verified in t
18990 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f  he.** pParse->co
189a0 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20  okieMask field. 
189b0 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61 6c   Later, after al
189c0 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73  l other code has
189d0 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74   been.** generat
189e0 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ed, the subrouti
189f0 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68 65  ne that does the
18a00 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61   cookie verifica
18a10 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61  tions and.** sta
18a20 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  rts the transact
18a30 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f 64  ions will be cod
18a40 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f  ed and the OP_Go
18a50 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77  to P2 value.** w
18a60 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 70  ill be made to p
18a70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75 62  oint to that sub
18a80 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67 65  routine.  The ge
18a90 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  neration of the.
18aa0 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  ** cookie verifi
18ab0 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e  cation subroutin
18ac0 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20 69  e code happens i
18ad0 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  n sqlite3FinishC
18ae0 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  oding()..**.** I
18af0 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f 64  f iDb<0 then cod
18b00 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e  e the OP_Goto on
18b10 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20 66  ly - don't set f
18b20 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74 68  lag to verify th
18b30 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20 61  e.** schema on a
18b40 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20 54  ny databases.  T
18b50 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
18b60 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20  to position the 
18b70 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79  OP_Goto.** early
18b80 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62 65   in the code, be
18b90 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66 20  fore we know if 
18ba0 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61 62  any database tab
18bb0 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  les will be used
18bc0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18bd0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
18be0 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
18bf0 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
18c00 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
18c10 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b   *v;.  int mask;
18c20 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
18c30 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
18c40 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
18c50 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e  urn;  /* This on
18c60 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68  ly happens if th
18c70 65 72 65 20 77 61 73 20 61 20 70 72 69 6f 72 20  ere was a prior 
18c80 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20 3d 20  error */.  db = 
18c90 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
18ca0 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  ( pParse->cookie
18cb0 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Goto==0 ){.    p
18cc0 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
18cd0 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  o = sqlite3VdbeA
18ce0 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
18cf0 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20   0, 0)+1;.  }.  
18d00 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20  if( iDb>=0 ){.  
18d10 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62    assert( iDb<db
18d20 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73  ->nDb );.    ass
18d30 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62  ert( db->aDb[iDb
18d40 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d  ].pBt!=0 || iDb=
18d50 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
18d60 28 20 69 44 62 3c 4d 41 58 5f 41 54 54 41 43 48  ( iDb<MAX_ATTACH
18d70 45 44 2b 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b  ED+2 );.    mask
18d80 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69   = 1<<iDb;.    i
18d90 66 28 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  f( (pParse->cook
18da0 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  ieMask & mask)==
18db0 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  0 ){.      pPars
18dc0 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d  e->cookieMask |=
18dd0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 50 61   mask;.      pPa
18de0 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  rse->cookieValue
18df0 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  [iDb] = db->aDb[
18e00 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63  iDb].pSchema->sc
18e10 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20  hema_cookie;.   
18e20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
18e30 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
18e40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18e50 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
18e60 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
18e70 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
18e80 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
18e90 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65  BE code that pre
18ea0 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20  pares for doing 
18eb0 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  an operation tha
18ec0 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
18ed0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  e the database..
18ee0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
18ef0 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20  ne starts a new 
18f00 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77  transaction if w
18f10 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64  e are not alread
18f20 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72  y within.** a tr
18f30 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77  ansaction.  If w
18f40 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69  e are already wi
18f50 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
18f60 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b  on, then a check
18f70 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20  point.** is set 
18f80 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d  if the setStatem
18f90 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ent parameter is
18fa0 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70   true.  A checkp
18fb0 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  oint should.** b
18fc0 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74  e set for operat
18fd0 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20  ions that might 
18fe0 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63  fail (due to a c
18ff0 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20  onstraint) part 
19000 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68  of.** the way th
19010 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20  rough and which 
19020 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64  will need to und
19030 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69  o some writes wi
19040 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a  thout having to.
19050 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
19060 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
19070 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f  n.  For operatio
19080 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e  ns where all con
19090 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20  straints.** can 
190a0 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72  be checked befor
190b0 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72  e any changes ar
190c0 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
190d0 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65  tabase, it is ne
190e0 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79  ver.** necessary
190f0 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65   to undo a write
19100 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f   and the checkpo
19110 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  int should not b
19120 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  e set..**.** Onl
19130 79 20 64 61 74 61 62 61 73 65 20 69 44 62 20 61  y database iDb a
19140 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  nd the temp data
19150 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72  base are made wr
19160 69 74 61 62 6c 65 20 62 79 20 74 68 69 73 20 63  itable by this c
19170 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d  all..** If iDb==
19180 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e  0, then the main
19190 20 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61   and temp databa
191a0 73 65 73 20 61 72 65 20 6d 61 64 65 20 77 72 69  ses are made wri
191b0 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69  table.   If.** i
191c0 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20  Db==1 then only 
191d0 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
191e0 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
191f0 6c 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68  le.  If iDb>1 th
19200 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66  en the.** specif
19210 69 65 64 20 61 75 78 69 6c 69 61 72 79 20 64 61  ied auxiliary da
19220 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 74  tabase and the t
19230 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65  emp database are
19240 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a   made writable..
19250 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
19260 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
19270 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
19280 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65  , int setStateme
19290 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  nt, int iDb){.  
192a0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
192b0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
192c0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
192d0 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
192e0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
192f0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
19300 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61   pParse->writeMa
19310 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20  sk |= 1<<iDb;.  
19320 69 66 28 20 73 65 74 53 74 61 74 65 6d 65 6e 74  if( setStatement
19330 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74   && pParse->nest
19340 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ed==0 ){.    sql
19350 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
19360 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69   OP_Statement, i
19370 44 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  Db, 0);.  }.  if
19380 28 20 28 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c  ( (OMIT_TEMPDB |
19390 7c 20 69 44 62 21 3d 31 29 20 26 26 20 70 50 61  | iDb!=1) && pPa
193a0 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e  rse->db->aDb[1].
193b0 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  pBt!=0 ){.    sq
193c0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
193d0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
193e0 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 31   setStatement, 1
193f0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
19400 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
19410 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20  pIndex uses the 
19420 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
19430 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72  ce pColl.  Retur
19440 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20  n.** true if it 
19450 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69  does and false i
19460 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  f it does not..*
19470 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
19480 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
19490 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69  atic int collati
194a0 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68  onMatch(const ch
194b0 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78  ar *zColl, Index
194c0 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74   *pIndex){.  int
194d0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
194e0 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  <pIndex->nColumn
194f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
19500 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64  t char *z = pInd
19510 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  ex->azColl[i];. 
19520 20 20 20 69 66 28 20 7a 3d 3d 7a 43 6f 6c 6c 20     if( z==zColl 
19530 7c 7c 20 28 7a 20 26 26 20 7a 43 6f 6c 6c 20 26  || (z && zColl &
19540 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
19550 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 29 20 29  Cmp(z, zColl)) )
19560 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
19570 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
19580 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
19590 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
195a0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
195b0 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74   pTab that use t
195c0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
195d0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20  uence pColl..** 
195e0 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
195f0 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   recompute all i
19600 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a  ndices of pTab..
19610 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
19620 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
19630 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
19640 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  exTable(Parse *p
19650 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
19660 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ab, char const *
19670 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20  zColl){.  Index 
19680 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
19690 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
196a0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
196b0 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72  h pTab */..  for
196c0 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49  (pIndex=pTab->pI
196d0 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
196e0 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65  ndex=pIndex->pNe
196f0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f  xt){.    if( zCo
19700 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69  ll==0 || collati
19710 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70  onMatch(zColl, p
19720 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20  Index) ){.      
19730 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
19740 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
19750 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
19760 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
19770 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
19780 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
19790 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
197a0 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
197b0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
197c0 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  ndex, -1);.    }
197d0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
197e0 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
197f0 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c  ll indices of al
19800 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20  l tables in all 
19810 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65 20  databases where 
19820 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75  the.** indices u
19830 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  se the collating
19840 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
19850 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68    If pColl==0 th
19860 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20  en recompute.** 
19870 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72  all indices ever
19880 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64  ywhere..*/.#ifnd
19890 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
198a0 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
198b0 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62 61  id reindexDataba
198c0 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ses(Parse *pPars
198d0 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  e, char const *z
198e0 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62  Coll){.  Db *pDb
198f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19900 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
19910 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
19920 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
19930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19940 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
19950 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
19960 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
19970 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
19980 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
19990 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65  ion */.  HashEle
199a0 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20  m *k;           
199b0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
199c0 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
199d0 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c  in pDb */.  Tabl
199e0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
199f0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
19a00 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
19a10 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62  se */..  for(iDb
19a20 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b  =0, pDb=db->aDb;
19a30 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
19a40 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20  b++, pDb++){.   
19a50 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30 20   assert( pDb!=0 
19a60 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c  );.    for(k=sql
19a70 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44  iteHashFirst(&pD
19a80 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
19a90 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69  ash);  k; k=sqli
19aa0 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a  teHashNext(k)){.
19ab0 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
19ac0 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
19ad0 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65  ata(k);.      re
19ae0 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
19af0 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b  e, pTab, zColl);
19b00 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
19b10 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
19b20 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
19b30 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
19b40 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52  ..**.**        R
19b50 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20  EINDEX          
19b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b70 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20    -- 1.**       
19b80 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61   REINDEX  <colla
19b90 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20  tion>           
19ba0 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20      -- 2.**     
19bb0 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
19bc0 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e  tabase>.?<tablen
19bd0 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20  ame>  -- 3.**   
19be0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
19bf0 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65  database>.?<inde
19c00 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a  xname>  -- 4.**.
19c10 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73  ** Form 1 causes
19c20 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
19c30 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
19c40 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62  abases to be reb
19c50 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20  uilt..** Form 2 
19c60 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64  rebuilds all ind
19c70 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  ices in all data
19c80 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74  bases that use t
19c90 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c  he named.** coll
19ca0 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20  ating function. 
19cb0 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72   Forms 3 and 4 r
19cc0 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64  ebuild the named
19cd0 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a   index or all.**
19ce0 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
19cf0 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
19d00 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66  ed table..*/.#if
19d10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19d20 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71  _REINDEX.void sq
19d30 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72  lite3Reindex(Par
19d40 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
19d50 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e  n *pName1, Token
19d60 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c   *pName2){.  Col
19d70 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
19d80 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
19d90 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
19da0 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20  o be reindexed, 
19db0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61  or NULL */.  cha
19dc0 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
19dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
19de0 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
19df0 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndex */.  const 
19e00 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20  char *zDb;      
19e10 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
19e20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
19e30 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
19e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19e50 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
19e60 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49   database */.  I
19e70 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
19e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
19e90 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
19ea0 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20  d with pTab */. 
19eb0 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
19ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19ed0 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
19ee0 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
19ef0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
19f00 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
19f10 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
19f20 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ction */.  Token
19f30 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20   *pObjName;     
19f40 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
19f50 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
19f60 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64  ndex to be reind
19f70 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  exed */..  /* Re
19f80 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
19f90 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72  schema. If an er
19fa0 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
19fb0 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
19fc0 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65  ge.  ** and code
19fd0 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
19fe0 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  eturn NULL. */. 
19ff0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1a000 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
1a010 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
1a020 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
1a030 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c  if( pName1==0 ||
1a040 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b   pName1->z==0 ){
1a050 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61  .    reindexData
1a060 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29  bases(pParse, 0)
1a070 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1a080 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 32  }else if( pName2
1a090 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a  ==0 || pName2->z
1a0a0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
1a0b0 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a  t( pName1->z );.
1a0c0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1a0d0 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
1a0e0 62 2c 20 45 4e 43 28 64 62 29 2c 20 28 63 68 61  b, ENC(db), (cha
1a0f0 72 2a 29 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e  r*)pName1->z, pN
1a100 61 6d 65 31 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  ame1->n, 0);.   
1a110 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
1a120 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20      char *zColl 
1a130 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
1a140 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4e  (const char *)pN
1a150 61 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d  ame1->z, pName1-
1a160 3e 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  >n);.      if( z
1a170 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
1a180 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
1a190 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
1a1a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
1a1b0 72 65 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  ree(zColl);.    
1a1c0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1a1d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 44  ;.    }.  }.  iD
1a1e0 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
1a1f0 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
1a200 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
1a210 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
1a220 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
1a230 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
1a240 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4f 62 6a  meFromToken(pObj
1a250 4e 61 6d 65 29 3b 0a 20 20 7a 44 62 20 3d 20 64  Name);.  zDb = d
1a260 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
1a270 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  e;.  pTab = sqli
1a280 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
1a290 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20   z, zDb);.  if( 
1a2a0 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e  pTab ){.    rein
1a2b0 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
1a2c0 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73   pTab, 0);.    s
1a2d0 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
1a2e0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1a2f0 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
1a300 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c  FindIndex(db, z,
1a310 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 46   zDb);.  sqliteF
1a320 72 65 65 28 7a 29 3b 0a 20 20 69 66 28 20 70 49  ree(z);.  if( pI
1a330 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
1a340 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1a350 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
1a360 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
1a370 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
1a380 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
1a390 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
1a3a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
1a3b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1a3c0 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66  nable to identif
1a3d0 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  y the object to 
1a3e0 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a  be reindexed");.
1a3f0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1a400 52 65 74 75 72 6e 20 61 20 64 79 6e 61 6d 69 63  Return a dynamic
1a410 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79  ly allocated Key
1a420 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
1a430 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a  hat can be used.
1a440 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52  ** with OP_OpenR
1a450 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72  ead or OP_OpenWr
1a460 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 64 61  ite to access da
1a470 74 61 62 61 73 65 20 69 6e 64 65 78 20 70 49 64  tabase index pId
1a480 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  x..**.** If succ
1a490 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65  essful, a pointe
1a4a0 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 72  r to the new str
1a4b0 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72 6e  ucture is return
1a4c0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
1a4d0 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
1a4e0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1a4f0 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  r calling sqlite
1a500 46 72 65 65 28 29 20 6f 6e 20 74 68 65 20 72 65  Free() on the re
1a510 74 75 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e 74  turned .** point
1a520 65 72 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  er. If an error 
1a530 6f 63 63 75 72 73 20 28 6f 75 74 20 6f 66 20 6d  occurs (out of m
1a540 65 6d 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e 67  emory or missing
1a550 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73   collation .** s
1a560 65 71 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20 69  equence), NULL i
1a570 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
1a580 68 65 20 73 74 61 74 65 20 6f 66 20 70 50 61 72  he state of pPar
1a590 73 65 20 75 70 64 61 74 65 64 20 74 6f 20 72 65  se updated to re
1a5a0 66 6c 65 63 74 0a 2a 2a 20 74 68 65 20 65 72 72  flect.** the err
1a5b0 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  or..*/.KeyInfo *
1a5c0 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
1a5d0 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
1a5e0 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  e, Index *pIdx){
1a5f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
1a600 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f  nCol = pIdx->nCo
1a610 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79 74  lumn;.  int nByt
1a620 65 73 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49  es = sizeof(KeyI
1a630 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a  nfo) + (nCol-1)*
1a640 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
1a650 20 2b 20 6e 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e   + nCol;.  KeyIn
1a660 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49  fo *pKey = (KeyI
1a670 6e 66 6f 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  nfo *)sqliteMall
1a680 6f 63 28 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69  oc(nBytes);..  i
1a690 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 70  f( pKey ){.    p
1a6a0 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  Key->aSortOrder 
1a6b0 3d 20 28 75 38 20 2a 29 26 28 70 4b 65 79 2d 3e  = (u8 *)&(pKey->
1a6c0 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20  aColl[nCol]);.  
1a6d0 20 20 61 73 73 65 72 74 28 20 26 70 4b 65 79 2d    assert( &pKey-
1a6e0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c  >aSortOrder[nCol
1a6f0 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70 4b 65 79  ]==&(((u8 *)pKey
1a700 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b 0a 20 20  )[nBytes]) );.  
1a710 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
1a720 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; i++){.      c
1a730 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64  har *zColl = pId
1a740 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
1a750 20 20 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c      assert( zCol
1a760 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d  l );.      pKey-
1a770 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69  >aColl[i] = sqli
1a780 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
1a790 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20  (pParse, zColl, 
1a7a0 2d 31 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d  -1);.      pKey-
1a7b0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
1a7c0 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
1a7d0 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  r[i];.    }.    
1a7e0 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pKey->nField = n
1a7f0 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  Col;.  }..  if( 
1a800 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
1a810 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1a820 4b 65 79 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d  Key);.    pKey =
1a830 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1a840 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65   pKey;.}..#ifnde
1a850 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a860 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54  TOVACUUM./*.** T
1a870 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  his is called to
1a880 20 63 6f 6d 70 69 6c 65 20 61 20 73 74 61 74 65   compile a state
1a890 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d  ment of the form
1a8a0 20 22 49 4e 43 52 45 4d 45 4e 54 41 4c 20 56 41   "INCREMENTAL VA
1a8b0 43 55 55 4d 22 2e 0a 2a 2f 0a 76 6f 69 64 20 73  CUUM"..*/.void s
1a8c0 71 6c 69 74 65 33 49 6e 63 72 56 61 63 75 75 6d  qlite3IncrVacuum
1a8d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1a8e0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
1a8f0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1a900 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
1a910 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
1a920 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
1a930 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1a940 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  rse, 0, 0);.    
1a950 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
1a960 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1a970 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a980 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 63  eAddOp(v, OP_Inc
1a990 72 56 61 63 75 75 6d 2c 20 30 2c 20 61 64 64 72  rVacuum, 0, addr
1a9a0 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +3);.    sqlite3
1a9b0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1a9c0 43 61 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 29 3b  Callback, 0, 0);
1a9d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a9e0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
1a9f0 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a  , 0, addr);.  }.
1aa00 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
1aa10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1aa20 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a        AUTOVACUUM */.