/ Hex Artifact Content
Login

Artifact b58dd7c7a763a228196022ec0d51781ed6995cde:


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 34 38 20 32 30 30 37 2f 31 31 2f 31 32  1.448 2007/11/12
02f0: 20 30 39 3a 35 30 3a 32 36 20 64 61 6e 69 65 6c   09:50:26 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 69 44 62 3c 30 20 29 7b 0a 20 20   if( iDb<0 ){.  
08f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
0900: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
0910: 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20  se->nTableLock; 
0920: 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  i++){.    p = &p
0930: 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63  Parse->aTableLoc
0940: 6b 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d  k[i];.    if( p-
0950: 3e 69 44 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e  >iDb==iDb && p->
0960: 69 54 61 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20  iTab==iTab ){.  
0970: 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f      p->isWriteLo
0980: 63 6b 20 3d 20 28 70 2d 3e 69 73 57 72 69 74 65  ck = (p->isWrite
0990: 4c 6f 63 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c  Lock || isWriteL
09a0: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ock);.      retu
09b0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rn;.    }.  }.. 
09c0: 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66   nBytes = sizeof
09d0: 28 54 61 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70  (TableLock) * (p
09e0: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
09f0: 6b 2b 31 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  k+1);.  pParse->
0a00: 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 20 0a 20 20  aTableLock = .  
0a10: 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61      sqlite3DbRea
0a20: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73  llocOrFree(pPars
0a30: 65 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61  e->db, pParse->a
0a40: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
0a50: 73 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  s);.  if( pParse
0a60: 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 29 7b 0a  ->aTableLock ){.
0a70: 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d      p = &pParse-
0a80: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 70 50 61 72  >aTableLock[pPar
0a90: 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b 2b  se->nTableLock++
0aa0: 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d 20  ];.    p->iDb = 
0ab0: 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62  iDb;.    p->iTab
0ac0: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e   = iTab;.    p->
0ad0: 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69 73  isWriteLock = is
0ae0: 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20 70  WriteLock;.    p
0af0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
0b00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
0b10: 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  arse->nTableLock
0b20: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65   = 0;.    pParse
0b30: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
0b40: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
0b50: 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
0b60: 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74 72 75  TableLock instru
0b70: 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74  ction for each t
0b80: 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79 20 74  able locked by t
0b90: 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  he.** statement 
0ba0: 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 63  (configured by c
0bb0: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 54  alls to sqlite3T
0bc0: 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a 2f 0a  ableLock())..*/.
0bd0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
0be0: 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72 73 65  TableLocks(Parse
0bf0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
0c00: 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56 64 62   i;.  Vdbe *pVdb
0c10: 65 3b 20 0a 0a 20 20 69 66 28 20 30 3d 3d 28 70  e; ..  if( 0==(p
0c20: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Vdbe = sqlite3Ge
0c30: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 20 29  tVdbe(pParse)) )
0c40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
0c50: 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
0c60: 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f  pParse->nTableLo
0c70: 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61  ck; i++){.    Ta
0c80: 62 6c 65 4c 6f 63 6b 20 2a 70 20 3d 20 26 70 50  bleLock *p = &pP
0c90: 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b  arse->aTableLock
0ca0: 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 70 31 20  [i];.    int p1 
0cb0: 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 20 20 69 66  = p->iDb;.    if
0cc0: 28 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b  ( p->isWriteLock
0cd0: 20 29 7b 0a 20 20 20 20 20 20 70 31 20 3d 20 2d   ){.      p1 = -
0ce0: 31 2a 28 70 31 2b 31 29 3b 0a 20 20 20 20 7d 0a  1*(p1+1);.    }.
0cf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
0d00: 70 33 28 70 56 64 62 65 2c 20 4f 50 5f 54 61 62  p3(pVdbe, OP_Tab
0d10: 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70 2d 3e 69  leLock, p1, p->i
0d20: 54 61 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50  Tab, p->zName, P
0d30: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d  3_STATIC);.  }.}
0d40: 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
0d50: 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28   codeTableLocks(
0d60: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
0d70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
0d80: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20   called after a 
0d90: 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65  single SQL state
0da0: 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a  ment has been.**
0db0: 20 70 61 72 73 65 64 20 61 6e 64 20 61 20 56 44   parsed and a VD
0dc0: 42 45 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78  BE program to ex
0dd0: 65 63 75 74 65 20 74 68 61 74 20 73 74 61 74 65  ecute that state
0de0: 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a  ment has been.**
0df0: 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 69 73   prepared.  This
0e00: 20 72 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68   routine puts th
0e10: 65 20 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63  e finishing touc
0e20: 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44  hes on the.** VD
0e30: 42 45 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72  BE program and r
0e40: 65 73 65 74 73 20 74 68 65 20 70 50 61 72 73 65  esets the pParse
0e50: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74   structure for t
0e60: 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65  he next.** parse
0e70: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
0e80: 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  t if an error oc
0e90: 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74  curred, it might
0ea0: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
0eb0: 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64  t.** no VDBE cod
0ec0: 65 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e  e was generated.
0ed0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0ee0: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72  FinishCoding(Par
0ef0: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0f00: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
0f10: 62 65 20 2a 76 3b 0a 0a 20 20 64 62 20 3d 20 70  be *v;..  db = p
0f20: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0f30: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0f40: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
0f50: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
0f60: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0f70: 20 21 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20   !pParse->pVdbe 
0f80: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
0f90: 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e->rc==SQLITE_OK
0fa0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
0fb0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
0fc0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
0fd0: 52 4f 52 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ROR;.      retur
0fe0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
0ff0: 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65  /* Begin by gene
1000: 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d  rating some term
1010: 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20  ination code at 
1020: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
1030: 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d   ** vdbe program
1040: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
1050: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1060: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
1070: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1080: 64 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  dOp(v, OP_Halt, 
1090: 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  0, 0);..    /* T
10a0: 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63  he cookie mask c
10b0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20  ontains one bit 
10c0: 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73  for each databas
10d0: 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20  e file open..   
10e0: 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f   ** (Bit 0 is fo
10f0: 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73  r main, bit 1 is
1100: 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73   for temp, and s
1110: 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20  o forth.)  Bits 
1120: 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66  are.    ** set f
1130: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
1140: 20 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20   that is used.  
1150: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1160: 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20   start a.    ** 
1170: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65  transaction on e
1180: 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73  ach used databas
1190: 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20  e and to verify 
11a0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
11b0: 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68  e.    ** on each
11c0: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a   used database..
11d0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
11e0: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
11f0: 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 33 32  o>0 ){.      u32
1200: 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74   mask;.      int
1210: 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71 6c 69   iDb;.      sqli
1220: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1230: 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  v, pParse->cooki
1240: 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20 20 20  eGoto-1);.      
1250: 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d  for(iDb=0, mask=
1260: 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  1; iDb<db->nDb; 
1270: 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29  mask<<=1, iDb++)
1280: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
1290: 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f  ask & pParse->co
12a0: 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63  okieMask)==0 ) c
12b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
12c0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
12d0: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
12e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72  beAddOp(v, OP_Tr
1300: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62 2c 20  ansaction, iDb, 
1310: 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e  (mask & pParse->
1320: 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29 3b 0a  writeMask)!=0);.
1330: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1340: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56  dbeAddOp(v, OP_V
1350: 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69 44 62  erifyCookie, iDb
1360: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
1370: 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20 20 20  Value[iDb]);.   
1380: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1390: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
13a0: 54 41 42 4c 45 0a 20 20 20 20 20 20 69 66 28 20  TABLE.      if( 
13b0: 70 50 61 72 73 65 2d 3e 70 56 69 72 74 75 61 6c  pParse->pVirtual
13c0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  Lock ){.        
13d0: 63 68 61 72 20 2a 76 74 61 62 20 3d 20 28 63 68  char *vtab = (ch
13e0: 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 70 56 69  ar *)pParse->pVi
13f0: 72 74 75 61 6c 4c 6f 63 6b 2d 3e 70 56 74 61 62  rtualLock->pVtab
1400: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1410: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 56  3VdbeOp3(v, OP_V
1420: 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 76 74 61  Begin, 0, 0, vta
1430: 62 2c 20 50 33 5f 56 54 41 42 29 3b 0a 20 20 20  b, P3_VTAB);.   
1440: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1450: 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20 74     /* Once all t
1460: 68 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65 20  he cookies have 
1470: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 61 6e  been verified an
1480: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  d transactions o
1490: 70 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a 2a  pened, .      **
14a0: 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75   obtain the requ
14b0: 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b 73  ired table-locks
14c0: 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
14d0: 70 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20 20  p unless the .  
14e0: 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61      ** shared-ca
14f0: 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20 65  che feature is e
1500: 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  nabled..      */
1510: 0a 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c 65  .      codeTable
1520: 4c 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a 20  Locks(pParse);. 
1530: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1540: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
1550: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  , 0, pParse->coo
1560: 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a  kieGoto);.    }.
1570: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1580: 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 2f  OMIT_TRACE.    /
1590: 2a 20 41 64 64 20 61 20 4e 6f 2d 6f 70 20 74 68  * Add a No-op th
15a0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
15b0: 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
15c0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 53 51   the compiled SQ
15d0: 4c 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  L.    ** stateme
15e0: 6e 74 20 61 73 20 69 74 73 20 50 33 20 61 72 67  nt as its P3 arg
15f0: 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 64 6f 65  ument.  This doe
1600: 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  s not change the
1610: 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20   functionality. 
1620: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f     ** of the pro
1630: 67 72 61 6d 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  gram. .    **.  
1640: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65    ** This is use
1650: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73  d to implement s
1660: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29 2e 0a  qlite3_trace()..
1670: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
1680: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
1690: 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 70 50 61 72  Noop, 0, 0, pPar
16a0: 73 65 2d 3e 7a 53 71 6c 2c 20 70 50 61 72 73 65  se->zSql, pParse
16b0: 2d 3e 7a 54 61 69 6c 2d 70 50 61 72 73 65 2d 3e  ->zTail-pParse->
16c0: 7a 53 71 6c 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  zSql);.#endif /*
16d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
16e0: 43 45 20 2a 2f 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  CE */.  }...  /*
16f0: 20 47 65 74 20 74 68 65 20 56 44 42 45 20 70 72   Get the VDBE pr
1700: 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20  ogram ready for 
1710: 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20  execution.  */. 
1720: 20 69 66 28 20 76 20 26 26 20 70 50 61 72 73 65   if( v && pParse
1730: 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21 64 62  ->nErr==0 && !db
1740: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1750: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1760: 44 45 42 55 47 0a 20 20 20 20 46 49 4c 45 20 2a  DEBUG.    FILE *
1770: 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61  trace = (db->fla
1780: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
1790: 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f  Trace)!=0 ? stdo
17a0: 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69  ut : 0;.    sqli
17b0: 74 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20  te3VdbeTrace(v, 
17c0: 74 72 61 63 65 29 3b 0a 23 65 6e 64 69 66 0a 20  trace);.#endif. 
17d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61     sqlite3VdbeMa
17e0: 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73  keReady(v, pPars
17f0: 65 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73 65 2d  e->nVar, pParse-
1800: 3e 6e 4d 65 6d 2b 33 2c 0a 20 20 20 20 20 20 20  >nMem+3,.       
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 33    pParse->nTab+3
1830: 2c 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  , pParse->explai
1840: 6e 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  n);.    pParse->
1850: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1860: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f  ;.    pParse->co
1870: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20  lNamesSet = 0;. 
1880: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 73   }else if( pPars
1890: 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e->rc==SQLITE_OK
18a0: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
18b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
18c0: 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  R;.  }.  pParse-
18d0: 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61  >nTab = 0;.  pPa
18e0: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20  rse->nMem = 0;. 
18f0: 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20   pParse->nSet = 
1900: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61  0;.  pParse->nVa
1910: 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  r = 0;.  pParse-
1920: 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b  >cookieMask = 0;
1930: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  .  pParse->cooki
1940: 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  eGoto = 0;.}../*
1950: 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73  .** Run the pars
1960: 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  er and code gene
1970: 72 61 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c  rator recursivel
1980: 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  y in order to ge
1990: 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66  nerate.** code f
19a0: 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  or the SQL state
19b0: 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20  ment given onto 
19c0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
19d0: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a  Parse context.**
19e0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
19f0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
1a00: 57 68 65 6e 20 74 68 65 20 70 61 72 73 65 72 20  When the parser 
1a10: 69 73 20 72 75 6e 20 72 65 63 75 72 73 69 76 65  is run recursive
1a20: 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20  ly.** this way, 
1a30: 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c  the final OP_Hal
1a40: 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65  t is not appende
1a50: 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74  d and other init
1a60: 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e  ialization.** an
1a70: 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73  d finalization s
1a80: 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64  teps are omitted
1a90: 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 61   because those a
1aa0: 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74  re handling by t
1ab0: 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20  he.** outermost 
1ac0: 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  parser..**.** No
1ad0: 74 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  t everything is 
1ae0: 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20  nestable.  This 
1af0: 66 61 63 69 6c 69 74 79 20 69 73 20 64 65 73 69  facility is desi
1b00: 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a  gned to permit.*
1b10: 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  * INSERT, UPDATE
1b20: 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65  , and DELETE ope
1b30: 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20  rations against 
1b40: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20  SQLITE_MASTER.  
1b50: 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79  Use.** care if y
1b60: 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74 72 79  ou decide to try
1b70: 20 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75   to use this rou
1b80: 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74  tine for some ot
1b90: 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f  her purposes..*/
1ba0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73  .void sqlite3Nes
1bb0: 74 65 64 50 61 72 73 65 28 50 61 72 73 65 20 2a  tedParse(Parse *
1bc0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
1bd0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
1be0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
1bf0: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 23  .  char *zSql;.#
1c00: 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20   define SAVE_SZ 
1c10: 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20   (sizeof(Parse) 
1c20: 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65  - offsetof(Parse
1c30: 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72 20 73  ,nVar)).  char s
1c40: 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b  aveBuf[SAVE_SZ];
1c50: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
1c60: 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
1c70: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1c80: 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f  >nested<10 );  /
1c90: 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64  * Nesting should
1ca0: 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69   only be of limi
1cb0: 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76  ted depth */.  v
1cc0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
1cd0: 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  mat);.  zSql = s
1ce0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
1cf0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 46 6f 72 6d  Parse->db, zForm
1d00: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
1d10: 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71  d(ap);.  if( zSq
1d20: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72  l==0 ){.    pPar
1d30: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1d40: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65  iled = 1;.    re
1d50: 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c  turn;   /* A mal
1d60: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1d70: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50  iled */.  }.  pP
1d80: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a  arse->nested++;.
1d90: 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66    memcpy(saveBuf
1da0: 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  , &pParse->nVar,
1db0: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d   SAVE_SZ);.  mem
1dc0: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  set(&pParse->nVa
1dd0: 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  r, 0, SAVE_SZ);.
1de0: 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73    sqlite3RunPars
1df0: 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c  er(pParse, zSql,
1e00: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
1e10: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d  ree(zSql);.  mem
1e20: 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  cpy(&pParse->nVa
1e30: 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41 56 45  r, saveBuf, SAVE
1e40: 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  _SZ);.  pParse->
1e50: 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a  nested--;.}../*.
1e60: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
1e70: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
1e80: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
1e90: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
1ea0: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
1eb0: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
1ec0: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
1ed0: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
1ee0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
1ef0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
1f00: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
1f10: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
1f20: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
1f30: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
1f40: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
1f50: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
1f60: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  or the table and
1f70: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61   the.** first ma
1f80: 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20  tching table is 
1f90: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
1fa0: 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c  hecking for dupl
1fb0: 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e  icate table.** n
1fc0: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
1fd0: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
1fe0: 20 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20   is TEMP first, 
1ff0: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
2000: 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79  any.** auxiliary
2010: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
2020: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
2030: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  H command..**.**
2040: 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
2050: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a  3LocateTable()..
2060: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
2070: 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74  3FindTable(sqlit
2080: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
2090: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
20a0: 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65   char *zDatabase
20b0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  ){.  Table *p = 
20c0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  0;.  int i;.  as
20d0: 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29  sert( zName!=0 )
20e0: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
20f0: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
2100: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
2110: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
2120: 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68  : i;   /* Search
2130: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
2140: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 61  N */.    if( zDa
2150: 74 61 62 61 73 65 21 3d 30 20 26 26 20 73 71 6c  tabase!=0 && sql
2160: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74  ite3StrICmp(zDat
2170: 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a  abase, db->aDb[j
2180: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2190: 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  nue;.    p = sql
21a0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
21b0: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
21c0: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65  ->tblHash, zName
21d0: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b  , strlen(zName)+
21e0: 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20  1);.    if( p ) 
21f0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
2200: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
2210: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
2220: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
2230: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
2240: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
2250: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
2260: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
2270: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
2280: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
2290: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
22a0: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
22b0: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
22c0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
22d0: 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65   found.  Also le
22e0: 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20  ave an.** error 
22f0: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
2300: 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
2310: 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
2320: 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
2330: 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65  utine and sqlite
2340: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20  3FindTable() is 
2350: 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75  that this.** rou
2360: 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65  tine leaves an e
2370: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
2380: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20  pParse->zErrMsg 
2390: 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33  where.** sqlite3
23a0: 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73  FindTable() does
23b0: 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a   not..*/.Table *
23c0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
23d0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
23e0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
23f0: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
2400: 2a 7a 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c  *zDbase){.  Tabl
2410: 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  e *p;..  /* Read
2420: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2430: 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
2440: 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
2450: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2460: 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
2470: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
2480: 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
2490: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
24a0: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
24b0: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72  pParse) ){.    r
24c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
24d0: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  p = sqlite3FindT
24e0: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
24f0: 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b   zName, zDbase);
2500: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
2510: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
2520: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
2530: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2540: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
2550: 73 2e 25 73 22 2c 20 7a 44 62 61 73 65 2c 20 7a  s.%s", zDbase, z
2560: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
2570: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2580: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2590: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
25a0: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
25b0: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63   }.    pParse->c
25c0: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
25d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
25e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
25f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
2600: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2610: 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72  cribes .** a par
2620: 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69  ticular index gi
2630: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2640: 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e  that index.** an
2650: 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
2660: 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
2670: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64  contains the ind
2680: 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55  ex..** Return NU
2690: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
26a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
26b0: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
26c0: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
26d0: 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ched for the.** 
26e0: 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69  table and the fi
26f0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64  rst matching ind
2700: 65 78 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ex is returned. 
2710: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a   (No checking.**
2720: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69   for duplicate i
2730: 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f  ndex names is do
2740: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
2750: 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d   order is.** TEM
2760: 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41  P first, then MA
2770: 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78  IN, then any aux
2780: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2790: 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20   added.** using 
27a0: 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61  the ATTACH comma
27b0: 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  nd..*/.Index *sq
27c0: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73  lite3FindIndex(s
27d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
27e0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
27f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
2800: 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b  .  Index *p = 0;
2810: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
2820: 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69  i=OMIT_TEMPDB; i
2830: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
2840: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
2850: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a  ) ? i^1 : i;  /*
2860: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
2870: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
2880: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
2890: 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63  = db->aDb[j].pSc
28a0: 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 7a 44  hema;.    if( zD
28b0: 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  b && sqlite3StrI
28c0: 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62  Cmp(zDb, db->aDb
28d0: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
28e0: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
28f0: 74 28 20 70 53 63 68 65 6d 61 20 7c 7c 20 28 6a  t( pSchema || (j
2900: 3d 3d 31 20 26 26 20 21 64 62 2d 3e 61 44 62 5b  ==1 && !db->aDb[
2910: 31 5d 2e 70 42 74 29 20 29 3b 0a 20 20 20 20 69  1].pBt) );.    i
2920: 66 28 20 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  f( pSchema ){.  
2930: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
2940: 61 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61  ashFind(&pSchema
2950: 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65  ->idxHash, zName
2960: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b  , strlen(zName)+
2970: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
2980: 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ( p ) break;.  }
2990: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
29a0: 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68  /*.** Reclaim th
29b0: 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  e memory used by
29c0: 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61   an index.*/.sta
29d0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64  tic void freeInd
29e0: 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ex(Index *p){.  
29f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
2a00: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69  zColAff);.  sqli
2a10: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a  te3_free(p);.}..
2a20: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
2a30: 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f   given index fro
2a40: 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  m the index hash
2a50: 20 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65   table, and free
2a60: 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73  .** its memory s
2a70: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a  tructures..**.**
2a80: 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 72 65   The index is re
2a90: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64  moved from the d
2aa0: 61 74 61 62 61 73 65 20 68 61 73 68 20 74 61 62  atabase hash tab
2ab0: 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73  les but.** it is
2ac0: 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72   not unlinked fr
2ad0: 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68 61  om the Table tha
2ae0: 74 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a  t it indexes..**
2af0: 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20   Unlinking from 
2b00: 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62  the Table must b
2b10: 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61  e done by the ca
2b20: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
2b30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2b40: 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78  qliteDeleteIndex
2b50: 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e  (Index *p){.  In
2b60: 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e  dex *pOld;.  con
2b70: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
2b80: 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f   p->zName;..  pO
2b90: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
2ba0: 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65  Insert(&p->pSche
2bb0: 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61  ma->idxHash, zNa
2bc0: 6d 65 2c 20 73 74 72 6c 65 6e 28 20 7a 4e 61 6d  me, strlen( zNam
2bd0: 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65  e)+1, 0);.  asse
2be0: 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70  rt( pOld==0 || p
2bf0: 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65 65  Old==p );.  free
2c00: 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  Index(p);.}../*.
2c10: 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78  ** For the index
2c20: 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65   called zIdxName
2c30: 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20   which is found 
2c40: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2c50: 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74  iDb,.** unlike t
2c60: 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69  hat index from i
2c70: 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65  ts Table then re
2c80: 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66  move the index f
2c90: 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rom.** the index
2ca0: 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
2cb0: 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  free all memory 
2cc0: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
2cd0: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
2ce0: 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64  e index..*/.void
2cf0: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
2d00: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c  dDeleteIndex(sql
2d10: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
2d20: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2d30: 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65  IdxName){.  Inde
2d40: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  x *pIndex;.  int
2d50: 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70 48   len;.  Hash *pH
2d60: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
2d70: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
2d80: 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73  Hash;..  len = s
2d90: 74 72 6c 65 6e 28 7a 49 64 78 4e 61 6d 65 29 3b  trlen(zIdxName);
2da0: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
2db0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
2dc0: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c  ash, zIdxName, l
2dd0: 65 6e 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  en+1, 0);.  if( 
2de0: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66  pIndex ){.    if
2df0: 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ( pIndex->pTable
2e00: 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78  ->pIndex==pIndex
2e10: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
2e20: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
2e30: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
2e40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e50: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
2e60: 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d     for(p=pIndex-
2e70: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
2e80: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d   p && p->pNext!=
2e90: 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65  pIndex; p=p->pNe
2ea0: 78 74 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20  xt){}.      if( 
2eb0: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
2ec0: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Index ){.       
2ed0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64   p->pNext = pInd
2ee0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ex->pNext;.     
2ef0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
2f00: 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
2f10: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
2f20: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
2f30: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
2f40: 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65  * Erase all sche
2f50: 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ma information f
2f60: 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  rom the in-memor
2f70: 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66  y hash tables of
2f80: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74  .** a single dat
2f90: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
2fa0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
2fb0: 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79  o reclaim memory
2fc0: 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64  .** before the d
2fd0: 61 74 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20  atabase closes. 
2fe0: 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c   It is also call
2ff0: 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ed during a roll
3000: 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65  back.** if there
3010: 20 77 65 72 65 20 73 63 68 65 6d 61 20 63 68 61   were schema cha
3020: 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20  nges during the 
3030: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69  transaction or i
3040: 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f  f a.** schema-co
3050: 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63  okie mismatch oc
3060: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  curs..**.** If i
3070: 44 62 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74  Db<=0 then reset
3080: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
3090: 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20  hema tables for 
30a0: 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  all database.** 
30b0: 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d  files.  If iDb>=
30c0: 32 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  2 then reset the
30d0: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
30e0: 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a   for only the.**
30f0: 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64   single file ind
3100: 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  icated..*/.void 
3110: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
3120: 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74  rnalSchema(sqlit
3130: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
3140: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20  {.  int i, j;.. 
3150: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
3160: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
3170: 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69  ;.  for(i=iDb; i
3180: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
3190: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
31a0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
31b0: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
31c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
31d0: 53 63 68 65 6d 61 46 72 65 65 28 70 44 62 2d 3e  SchemaFree(pDb->
31e0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
31f0: 20 20 20 20 69 66 28 20 69 44 62 3e 30 20 29 20      if( iDb>0 ) 
3200: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
3210: 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a  sert( iDb==0 );.
3220: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
3230: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
3240: 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  nges;..  /* If o
3250: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
3260: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
3270: 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62  base files has b
3280: 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a  een closed,.  **
3290: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
32a0: 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c  m from the auxil
32b0: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69  iary database li
32c0: 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65  st.  We take the
32d0: 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  .  ** opportunit
32e0: 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72  y to do this her
32f0: 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20  e since we have 
3300: 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c  just deleted all
3310: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68   of the.  ** sch
3320: 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20  ema hash tables 
3330: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f  and therefore do
3340: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b   not have to mak
3350: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20  e any changes.  
3360: 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f  ** to any of tho
3370: 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
3380: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
3390: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
33a0: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
33b0: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
33c0: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d    if( pDb->pBt==
33d0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
33e0: 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d  Db->pAux && pDb-
33f0: 3e 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d  >xFreeAux ) pDb-
3400: 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70  >xFreeAux(pDb->p
3410: 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  Aux);.      pDb-
3420: 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d  >pAux = 0;.    }
3430: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32  .  }.  for(i=j=2
3440: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
3450: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
3460: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3470: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3480: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
3490: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
34a0: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
34b0: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
34c0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
34d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
34e0: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
34f0: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
3500: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
3510: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
3520: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
3530: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
3540: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
3550: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
3560: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
3570: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
3580: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
3590: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
35a0: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
35b0: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
35c0: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
35d0: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61  lite3_free(db->a
35e0: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
35f0: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
3600: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3610: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3620: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d  alled when a com
3630: 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  mit occurs..*/.v
3640: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
3650: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
3660: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
3670: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
3680: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3690: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ges;.}../*.** Cl
36a0: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
36b0: 61 6d 65 73 20 66 72 6f 6d 20 61 20 74 61 62 6c  ames from a tabl
36c0: 65 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74  e or view..*/.st
36d0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
36e0: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
36f0: 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b  (Table *pTable){
3700: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75  .  int i;.  Colu
3710: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65  mn *pCol;.  asse
3720: 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b  rt( pTable!=0 );
3730: 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70  .  if( (pCol = p
3740: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20  Table->aCol)!=0 
3750: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
3760: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
3770: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
3780: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3790: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
37a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
37b0: 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66  Delete(pCol->pDf
37c0: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
37d0: 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  e3_free(pCol->zT
37e0: 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ype);.      sqli
37f0: 74 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a  te3_free(pCol->z
3800: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Coll);.    }.   
3810: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
3820: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
3830: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
3840: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 0;.  pTable->n
3850: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
3860: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
3870: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
3880: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
3890: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
38a0: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
38b0: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
38c0: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
38d0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
38e0: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
38f0: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
3900: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
3910: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
3920: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
3930: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
3940: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
3950: 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f  Nor does it remo
3960: 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65  ve.** foreign ke
3970: 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  ys from the sqli
3980: 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61  te.aFKey hash ta
3990: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
39a0: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
39b0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
39c0: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
39d0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
39e0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
39f0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  ** the table..*/
3a00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
3a10: 65 74 65 54 61 62 6c 65 28 54 61 62 6c 65 20 2a  eteTable(Table *
3a20: 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78  pTable){.  Index
3a30: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74   *pIndex, *pNext
3a40: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c  ;.  FKey *pFKey,
3a50: 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20   *pNextFKey;..  
3a60: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
3a70: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f  return;..  /* Do
3a80: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
3a90: 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20  table until the 
3aa0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
3ab0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f  reaches zero. */
3ac0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d  .  pTable->nRef-
3ad0: 2d 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  -;.  if( pTable-
3ae0: 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72  >nRef>0 ){.    r
3af0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
3b00: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65  ert( pTable->nRe
3b10: 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65  f==0 );..  /* De
3b20: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
3b30: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3b40: 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f   this table.  */
3b50: 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20  .  for(pIndex = 
3b60: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
3b70: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
3b80: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
3b90: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
3ba0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
3bb0: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  ndex->pSchema==p
3bc0: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29  Table->pSchema )
3bd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  ;.    sqliteDele
3be0: 74 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  teIndex(pIndex);
3bf0: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
3c00: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
3c10: 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74  N_KEY.  /* Delet
3c20: 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65  e all foreign ke
3c30: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
3c40: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20  th this table.  
3c50: 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68  The keys.  ** sh
3c60: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
3c70: 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20  y been unlinked 
3c80: 66 72 6f 6d 20 74 68 65 20 70 53 63 68 65 6d 61  from the pSchema
3c90: 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62  ->aFKey hash tab
3ca0: 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  le .  */.  for(p
3cb0: 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b  FKey=pTable->pFK
3cc0: 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79  ey; pFKey; pFKey
3cd0: 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20  =pNextFKey){.   
3ce0: 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b   pNextFKey = pFK
3cf0: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20  ey->pNextFrom;. 
3d00: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
3d10: 65 33 48 61 73 68 46 69 6e 64 28 26 70 54 61 62  e3HashFind(&pTab
3d20: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b  le->pSchema->aFK
3d30: 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3d50: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65  FKey->zTo, strle
3d60: 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29  n(pFKey->zTo)+1)
3d70: 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73  !=pFKey );.    s
3d80: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 4b 65  qlite3_free(pFKe
3d90: 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  y);.  }.#endif..
3da0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
3db0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
3dc0: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
3dd0: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
3de0: 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20  Names(pTable);. 
3df0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
3e00: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
3e10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61  sqlite3_free(pTa
3e20: 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  ble->zColAff);. 
3e30: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
3e40: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65  lete(pTable->pSe
3e50: 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  lect);.#ifndef S
3e60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
3e70: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
3e80: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 43 68  lete(pTable->pCh
3e90: 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  eck);.#endif.  s
3ea0: 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28  qlite3VtabClear(
3eb0: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
3ec0: 65 33 5f 66 72 65 65 28 70 54 61 62 6c 65 29 3b  e3_free(pTable);
3ed0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
3ee0: 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65   the given table
3ef0: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
3f00: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65  ables and the de
3f10: 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  lete the.** tabl
3f20: 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  e structure with
3f30: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
3f40: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
3f50: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
3f60: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
3f70: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
3f80: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
3f90: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  st char *zTabNam
3fa0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
3fb0: 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46    FKey *pF1, *pF
3fc0: 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  2;.  Db *pDb;.. 
3fd0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
3fe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
3ff0: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
4000: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  b );.  assert( z
4010: 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e  TabName && zTabN
4020: 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20  ame[0] );.  pDb 
4030: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
4040: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61  .  p = sqlite3Ha
4050: 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70  shInsert(&pDb->p
4060: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
4070: 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65   zTabName, strle
4080: 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 30 29  n(zTabName)+1,0)
4090: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66  ;.  if( p ){.#if
40a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
40b0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
40c0: 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65   for(pF1=p->pFKe
40d0: 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d  y; pF1; pF1=pF1-
40e0: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
40f0: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72     int nTo = str
4100: 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20  len(pF1->zTo) + 
4110: 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73  1;.      pF2 = s
4120: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
4130: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46  pDb->pSchema->aF
4140: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
4150: 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  To);.      if( p
4160: 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20  F2==pF1 ){.     
4170: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
4180: 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65  sert(&pDb->pSche
4190: 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e  ma->aFKey, pF1->
41a0: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70  zTo, nTo, pF1->p
41b0: 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d  NextTo);.      }
41c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68  else{.        wh
41d0: 69 6c 65 28 20 70 46 32 20 26 26 20 70 46 32 2d  ile( pF2 && pF2-
41e0: 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b  >pNextTo!=pF1 ){
41f0: 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54   pF2=pF2->pNextT
4200: 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  o; }.        if(
4210: 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20   pF2 ){.        
4220: 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d    pF2->pNextTo =
4230: 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20   pF1->pNextTo;. 
4240: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4250: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
4260: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
4270: 61 62 6c 65 28 70 29 3b 0a 20 20 7d 0a 20 20 64  able(p);.  }.  d
4280: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
4290: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
42a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
42b0: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
42c0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
42d0: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
42e0: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
42f0: 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20 71 75  oken with any qu
4300: 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65 64  otations removed
4310: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
4320: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
4330: 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69  ring.** is obtai
4340: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
4350: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
4360: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
4370: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
4380: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65  tion..**.** Toke
4390: 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73  ns are often jus
43a0: 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20  t pointers into 
43b0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
43c0: 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20   text and so.** 
43d0: 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72  are not \000 ter
43e0: 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20  minated and are 
43f0: 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20  not persistent. 
4400: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   The returned st
4410: 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20  ring.** is \000 
4420: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69  terminated and i
4430: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f  s persistent..*/
4440: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61  .char *sqlite3Na
4450: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69  meFromToken(sqli
4460: 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a  te3 *db, Token *
4470: 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  pName){.  char *
4480: 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61  zName;.  if( pNa
4490: 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
44a0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
44b0: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e  up(db, (char*)pN
44c0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
44d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
44e0: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
44f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
4500: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
4510: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zName;.}../*.
4520: 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69  ** Open the sqli
4530: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
4540: 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61  stored in databa
4550: 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f  se number iDb fo
4560: 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68  r.** writing. Th
4570: 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65  e table is opene
4580: 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30  d using cursor 0
4590: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
45a0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
45b0: 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69  (Parse *p, int i
45c0: 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
45d0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
45e0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62  p);.  sqlite3Tab
45f0: 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d  leLock(p, iDb, M
4600: 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53  ASTER_ROOT, 1, S
4610: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
4620: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
4630: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
4640: 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ger, iDb, 0);.  
4650: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4660: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
4670: 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  , 0, MASTER_ROOT
4680: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
4690: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e  AddOp(v, OP_SetN
46a0: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35 29  umColumns, 0, 5)
46b0: 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74  ; /* sqlite_mast
46c0: 65 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73  er has 5 columns
46d0: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   */.}../*.** The
46e0: 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f   token *pName co
46f0: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20  ntains the name 
4700: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65  of a database (e
4710: 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a  ither "main" or.
4720: 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65  ** "temp" or the
4730: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61   name of an atta
4740: 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72  ched db). This r
4750: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
4760: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74  he.** index of t
4770: 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  he named databas
4780: 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20  e in db->aDb[], 
4790: 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  or -1 if the nam
47a0: 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e  ed db .** does n
47b0: 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74  ot exist..*/.int
47c0: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73   sqlite3FindDb(s
47d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
47e0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  n *pName){.  int
47f0: 20 69 20 3d 20 2d 31 3b 20 20 20 20 2f 2a 20 44   i = -1;    /* D
4800: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
4810: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
4820: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4830: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
4840: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 44 62 20 2a  e name */.  Db *
4850: 70 44 62 3b 20 20 20 20 20 20 20 2f 2a 20 41 20  pDb;       /* A 
4860: 64 61 74 61 62 61 73 65 20 77 68 6f 73 65 20 6e  database whose n
4870: 61 6d 65 20 73 70 61 63 65 20 69 73 20 62 65 69  ame space is bei
4880: 6e 67 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  ng searched */. 
4890: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
48a0: 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73  /* Name we are s
48b0: 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a  earching for */.
48c0: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
48d0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
48e0: 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
48f0: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 6e  ( zName ){.    n
4900: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
4910: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d  ;.    for(i=(db-
4920: 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62  >nDb-1), pDb=&db
4930: 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20  ->aDb[i]; i>=0; 
4940: 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20  i--, pDb--){.   
4950: 20 20 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45     if( (!OMIT_TE
4960: 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26  MPDB || i!=1 ) &
4970: 26 20 6e 3d 3d 73 74 72 6c 65 6e 28 70 44 62 2d  & n==strlen(pDb-
4980: 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20  >zName) && .    
4990: 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33        0==sqlite3
49a0: 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61  StrICmp(pDb->zNa
49b0: 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  me, zName) ){.  
49c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
49d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
49e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
49f0: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
4a00: 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61   i;.}../* The ta
4a10: 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74  ble or view or t
4a20: 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70  rigger name is p
4a30: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
4a40: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
4a50: 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70  .** pName1 and p
4a60: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
4a70: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
4a80: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
4a90: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
4aa0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
4ab0: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20  x.yyy (...);.** 
4ac0: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
4ad0: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
4ae0: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
4af0: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
4b00: 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  and if.** the ta
4b10: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
4b20: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
4b30: 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45   i.e.:.**.** CRE
4b40: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
4b50: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70  .);.**.** Then p
4b60: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
4b70: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
4b80: 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68   is ""..**.** Th
4b90: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
4ba0: 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f  the *ppUnqual po
4bb0: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
4bc0: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
4bd0: 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32  me1 or.** pName2
4be0: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
4bf0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
4c00: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
4c10: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64  ndex of the.** d
4c20: 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73  atabase "xxx" is
4c30: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
4c40: 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  t sqlite3TwoPart
4c50: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
4c60: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
4c70: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
4c80: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
4c90: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
4ca0: 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54  Name1,      /* T
4cb0: 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20  he "xxx" in the 
4cc0: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f  name "xxx.yyy" o
4cd0: 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b  r "xxx" */.  Tok
4ce0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
4cf0: 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e   /* The "yyy" in
4d00: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
4d10: 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  yy" */.  Token *
4d20: 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20  *pUnqual     /* 
4d30: 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c  Write the unqual
4d40: 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d  ified object nam
4d50: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
4d60: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
4d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
4d80: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
4d90: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  he object */.  s
4da0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
4db0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
4dc0: 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32  pName2 && pName2
4dd0: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  ->n>0 ){.    ass
4de0: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
4df0: 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71  usy );.    *pUnq
4e00: 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20  ual = pName2;.  
4e10: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
4e20: 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31  indDb(db, pName1
4e30: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
4e40: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4e50: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4e60: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62  , "unknown datab
4e70: 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29  ase %T", pName1)
4e80: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
4e90: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
4ea0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
4eb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
4ec0: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  rt( db->init.iDb
4ed0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ==0 || db->init.
4ee0: 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20  busy );.    iDb 
4ef0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
4f00: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
4f10: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
4f20: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
4f30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4f40: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
4f50: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
4f60: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
4f70: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
4f80: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
4f90: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
4fa0: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
4fb0: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
4fc0: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
4fd0: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
4fe0: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
4ff0: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
5000: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
5010: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
5020: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
5030: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
5040: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
5050: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
5060: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f  internal use..*/
5070: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
5080: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73  kObjectName(Pars
5090: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
50a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
50b0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
50c0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
50d0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
50e0: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
50f0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
5100: 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65  s & SQLITE_Write
5110: 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20  Schema)==0.     
5120: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
5130: 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65  e3StrNICmp(zName
5140: 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20  , "sqlite_", 7) 
5150: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
5160: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
5170: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65  object name rese
5180: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
5190: 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d  l use: %s", zNam
51a0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
51b0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
51c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
51d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  _OK;.}../*.** Be
51e0: 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  gin constructing
51f0: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70   a new table rep
5200: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d  resentation in m
5210: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a  emory.  This is.
5220: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  ** the first of 
5230: 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72  several action r
5240: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74  outines that get
5250: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f   called in respo
5260: 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41  nse.** to a CREA
5270: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
5280: 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c  nt.  In particul
5290: 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ar, this routine
52a0: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66   is called.** af
52b0: 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e  ter seeing token
52c0: 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22  s "CREATE" and "
52d0: 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74  TABLE" and the t
52e0: 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69  able name. The i
52f0: 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73  sTemp.** flag is
5300: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62   true if the tab
5310: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  le should be sto
5320: 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c  red in the auxil
5330: 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  iary database.**
5340: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
5350: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
5360: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
5370: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68  s is normally th
5380: 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74  e case.** when t
5390: 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45  he "TEMP" or "TE
53a0: 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64  MPORARY" keyword
53b0: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
53c0: 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64  en.** CREATE and
53d0: 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68   TABLE..**.** Th
53e0: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
53f0: 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  rd is initialize
5400: 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61  d and put in pPa
5410: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a  rse->pNewTable..
5420: 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68  ** As more of th
5430: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
5440: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
5450: 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61  ed, additional a
5460: 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65  ction.** routine
5470: 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  s will be called
5480: 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66   to add more inf
5490: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
54a0: 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74   record..** At t
54b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
54c0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
54d0: 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65  ment, the sqlite
54e0: 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74  3EndTable() rout
54f0: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
5500: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
5510: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66   construction of
5520: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   the new table r
5530: 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ecord..*/.void s
5540: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
5550: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5560: 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63  e,   /* Parser c
5570: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
5580: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20  n *pName1,   /* 
5590: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68  First part of th
55a0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
55b0: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
55c0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
55d0: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
55e0: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
55f0: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
5600: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
5610: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
5620: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
5630: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
5640: 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a   isView,      /*
5650: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
5660: 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74   a VIEW */.  int
5670: 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a   isVirtual,   /*
5680: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
5690: 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65   a VIRTUAL table
56a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
56b0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
56c0: 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c  hing if table al
56d0: 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
56e0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
56f0: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  le;.  char *zNam
5700: 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61  e = 0; /* The na
5710: 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  me of the new ta
5720: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
5730: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5740: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
5750: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
5760: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5770: 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68  ber to create th
5780: 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20  e table in */.  
5790: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20  Token *pName;   
57a0: 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
57b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
57c0: 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a  e to create */..
57d0: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f    /* The table o
57e0: 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63  r view name to c
57f0: 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64 20  reate is passed 
5800: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
5810: 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20  via tokens.  ** 
5820: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
5830: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
5840: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
5850: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
5860: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
5870: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
5880: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a  x.yyy (...);.  *
5890: 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  * .  ** Then pNa
58a0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
58b0: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
58c0: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
58d0: 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20  er hand if.  ** 
58e0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
58f0: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
5900: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a  ified, i.e.:.  *
5910: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
5920: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20  BLE yyy(...);.  
5930: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  **.  ** Then pNa
5940: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
5950: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
5960: 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  s ""..  **.  ** 
5970: 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73  The call below s
5980: 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f  ets the pName po
5990: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
59a0: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
59b0: 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d  me1 or.  ** pNam
59c0: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
59d0: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
59e0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
59f0: 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a  variable iDb is.
5a00: 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20    ** set to the 
5a10: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
5a20: 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20 74  abase that the t
5a30: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20  able or view is 
5a40: 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  to be.  ** creat
5a50: 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44  ed in..  */.  iD
5a60: 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
5a70: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
5a80: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
5a90: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  pName);.  if( iD
5aa0: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
5ab0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
5ac0: 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 69 44   && isTemp && iD
5ad0: 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  b>1 ){.    /* If
5ae0: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70   creating a temp
5af0: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65   table, the name
5b00: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
5b10: 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c  ified */.    sql
5b20: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5b30: 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20  rse, "temporary 
5b40: 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20  table name must 
5b50: 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29  be unqualified")
5b60: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
5b70: 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45  }.  if( !OMIT_TE
5b80: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
5b90: 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61   iDb = 1;..  pPa
5ba0: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20  rse->sNameToken 
5bb0: 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d  = *pName;.  zNam
5bc0: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
5bd0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
5be0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
5bf0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
5c00: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
5c10: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
5c20: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
5c30: 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ame) ){.    goto
5c40: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
5c50: 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  or;.  }.  if( db
5c60: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20  ->init.iDb==1 ) 
5c70: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e  isTemp = 1;.#ifn
5c80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5c90: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
5ca0: 61 73 73 65 72 74 28 20 28 69 73 54 65 6d 70 20  assert( (isTemp 
5cb0: 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a  & 1)==isTemp );.
5cc0: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
5cd0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20  ;.    char *zDb 
5ce0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
5cf0: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
5d00: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
5d10: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
5d20: 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
5d30: 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a  LE(isTemp), 0, z
5d40: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
5d50: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5d60: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
5d70: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
5d80: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
5d90: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b  PDB && isTemp ){
5da0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
5db0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
5dc0: 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
5dd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
5de0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
5df0: 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  TE_VIEW;.      }
5e00: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5e10: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
5e20: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a  DB && isTemp ){.
5e30: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
5e40: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
5e50: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
5e60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
5e70: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
5e80: 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  TE_TABLE;.      
5e90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
5ea0: 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71  !isVirtual && sq
5eb0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
5ec0: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61  Parse, code, zNa
5ed0: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
5ee0: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
5ef0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
5f00: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
5f10: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
5f20: 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  e new table name
5f30: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64   does not collid
5f40: 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69  e with an existi
5f50: 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  ng.  ** index or
5f60: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74   table name in t
5f70: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
5f80: 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f  .  Issue an erro
5f90: 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a  r message if.  *
5fa0: 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65  * it does. The e
5fb0: 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74  xception is if t
5fc0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  he statement bei
5fd0: 6e 67 20 70 61 72 73 65 64 20 77 61 73 20 70 61  ng parsed was pa
5fe0: 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20  ssed.  ** to an 
5ff0: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
6000: 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20  vtab() call. In 
6010: 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74  that case only t
6020: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a  he column names.
6030: 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77    ** and types w
6040: 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20  ill be used, so 
6050: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
6060: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d   to test for nam
6070: 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c  espace.  ** coll
6080: 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  isions..  */.  i
6090: 66 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56  f( !IN_DECLARE_V
60a0: 54 41 42 20 29 7b 0a 20 20 20 20 69 66 28 20 53  TAB ){.    if( S
60b0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
60c0: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
60d0: 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  se) ){.      got
60e0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
60f0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ror;.    }.    p
6100: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46  Table = sqlite3F
6110: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
6120: 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  me, db->aDb[iDb]
6130: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  .zName);.    if(
6140: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20   pTable ){.     
6150: 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20   if( !noErr ){. 
6160: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
6170: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6180: 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79  table %T already
6190: 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29   exists", pName)
61a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
61b0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
61c0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
61d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
61e0: 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
61f0: 2c 20 30 29 21 3d 30 20 26 26 20 28 69 44 62 3d  , 0)!=0 && (iDb=
6200: 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e  =0 || !db->init.
6210: 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73  busy) ){.      s
6220: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6230: 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73  Parse, "there is
6240: 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65   already an inde
6250: 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  x named %s", zNa
6260: 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
6270: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
6280: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
6290: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  pTable = sqlite3
62a0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
62b0: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
62c0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
62d0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   ){.    db->mall
62e0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
62f0: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
6300: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
6310: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
6320: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
6330: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
6340: 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  .  pTable->zName
6350: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62   = zName;.  pTab
6360: 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  le->iPKey = -1;.
6370: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
6380: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
6390: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62  .pSchema;.  pTab
63a0: 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  le->nRef = 1;.  
63b0: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  if( pParse->pNew
63c0: 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33 44  Table ) sqlite3D
63d0: 65 6c 65 74 65 54 61 62 6c 65 28 70 50 61 72 73  eleteTable(pPars
63e0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20  e->pNewTable);. 
63f0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6400: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
6410: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
6420: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
6430: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
6440: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
6450: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
6460: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
6470: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
6480: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
6490: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
64a0: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
64b0: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
64c0: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
64d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
64e0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
64f0: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  NT.  if( !pParse
6500: 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63  ->nested && strc
6510: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
6520: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
6530: 29 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70  ){.    pTable->p
6540: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20  Schema->pSeqTab 
6550: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  = pTable;.  }.#e
6560: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ndif..  /* Begin
6570: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
6580: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
6590: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
65a0: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
65b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
65c0: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
65d0: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
65e0: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
65f0: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
6600: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
6610: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6620: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
6630: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
6640: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
6650: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
6660: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
6670: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
6680: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
6690: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
66a0: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
66b0: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
66c0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
66d0: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
66e0: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
66f0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
6700: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
6710: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
6720: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
6730: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20  init.busy && (v 
6740: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
6750: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
6760: 20 20 20 20 69 6e 74 20 6c 62 6c 3b 0a 20 20 20      int lbl;.   
6770: 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b   int fileFormat;
6780: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
6790: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
67a0: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
67b0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
67c0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
67d0: 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56 69 72  LE.    if( isVir
67e0: 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  tual ){.      sq
67f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6800: 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c 20  , OP_VBegin, 0, 
6810: 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
6820: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
6830: 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20  file format and 
6840: 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20  encoding in the 
6850: 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f  database have no
6860: 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20  t been set, .   
6870: 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77   ** set them now
6880: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
6890: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
68a0: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
68b0: 69 44 62 2c 20 31 29 3b 20 20 20 2f 2a 20 66 69  iDb, 1);   /* fi
68c0: 6c 65 5f 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20  le_format */.   
68d0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
68e0: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
68f0: 20 20 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33     lbl = sqlite3
6900: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
6910: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6920: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c  eAddOp(v, OP_If,
6930: 20 30 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 66 69   0, lbl);.    fi
6940: 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e  leFormat = (db->
6950: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c  flags & SQLITE_L
6960: 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30  egacyFileFmt)!=0
6970: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
6980: 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f       1 : SQLITE_
6990: 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b  MAX_FILE_FORMAT;
69a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
69b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
69c0: 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c  ger, fileFormat,
69d0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
69e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
69f0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
6a00: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
6a10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6a20: 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29 2c  nteger, ENC(db),
6a30: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6a40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6a50: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
6a60: 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  4);.    sqlite3V
6a70: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
6a80: 76 2c 20 6c 62 6c 29 3b 0a 0a 20 20 20 20 2f 2a  v, lbl);..    /*
6a90: 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61 74   This just creat
6aa0: 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65  es a place-holde
6ab0: 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  r record in the 
6ac0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
6ad0: 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ble..    ** The 
6ae0: 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20 64  record created d
6af0: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
6b00: 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49  anything yet.  I
6b10: 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63  t will be replac
6b20: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
6b30: 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63   real entry in c
6b40: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61 74  ode generated at
6b50: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
6b60: 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
6b70: 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
6b80: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73  the new entry is
6b90: 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 74 6f 70   left on the top
6ba0: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   of the stack.. 
6bb0: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
6bc0: 76 61 6c 75 65 20 69 73 20 6e 65 65 64 65 64 20  value is needed 
6bd0: 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  by the code that
6be0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
6bf0: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e   will.    ** gen
6c00: 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69  erate..    */.#i
6c10: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
6c20: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
6c30: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6c40: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
6c50: 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65  E).    if( isVie
6c60: 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29  w || isVirtual )
6c70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6c80: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6c90: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
6ca0: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
6cb0: 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69      {.      sqli
6cc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6cd0: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20  OP_CreateTable, 
6ce0: 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  iDb, 0);.    }. 
6cf0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
6d00: 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65  sterTable(pParse
6d10: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
6d20: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6d30: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20  OP_NewRowid, 0, 
6d40: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
6d50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
6d60: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  up, 0, 0);.    s
6d70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6d80: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
6d90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6da0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
6db0: 73 65 72 74 2c 20 30 2c 20 4f 50 46 4c 41 47 5f  sert, 0, OPFLAG_
6dc0: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c  APPEND);.    sql
6dd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6de0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
6df0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6e00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
6e10: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  l, 1, 0);.  }.. 
6e20: 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d   /* Normal (non-
6e30: 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a  error) return. *
6e40: 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  /.  return;..  /
6e50: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
6e60: 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65  curs, we jump he
6e70: 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c  re */.begin_tabl
6e80: 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74  e_error:.  sqlit
6e90: 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
6ea0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
6eb0: 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73  ** This macro is
6ec0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65   used to compare
6ed0: 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69 6e 20   two strings in 
6ee0: 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69  a case-insensiti
6ef0: 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74  ve manner..** It
6f00: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61 73   is slightly fas
6f10: 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67  ter than calling
6f20: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6f30: 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75 74 0a  ) directly, but.
6f40: 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61 72 67  ** produces larg
6f50: 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57  er code..**.** W
6f60: 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61 63  ARNING: This mac
6f70: 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74  ro is not compat
6f80: 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 74  ible with the st
6f90: 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20 49  rcmp() family. I
6fa0: 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72 75  t.** returns tru
6fb0: 65 20 69 66 20 74 68 65 20 74 77 6f 20 73 74 72  e if the two str
6fc0: 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c 2c 20  ings are equal, 
6fd0: 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e  otherwise false.
6fe0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 52 49  .*/.#define STRI
6ff0: 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c  CMP(x, y) (\.sql
7000: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
7010: 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  [*(unsigned char
7020: 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71   *)(x)]==   \.sq
7030: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
7040: 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  r[*(unsigned cha
7050: 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a 26  r *)(y)]     \.&
7060: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
7070: 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30  ((x)+1,(y)+1)==0
7080: 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20   )../*.** Add a 
7090: 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68  new column to th
70a0: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
70b0: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
70c0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
70d0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
70e0: 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f   routine once fo
70f0: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65  r each column de
7100: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  claration.** in 
7110: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
7120: 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74  tatement.  sqlit
7130: 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67  e3StartTable() g
7140: 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69  ets called.** fi
7150: 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67  rst to get thing
7160: 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74  s going.  Then t
7170: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7180: 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a  alled for each.*
7190: 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69  * column..*/.voi
71a0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
71b0: 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mn(Parse *pParse
71c0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
71d0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
71e0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt i;.  char *z;
71f0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
7200: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
7210: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
7220: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
7230: 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 53 51 4c 49  ( p->nCol+1>SQLI
7240: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 7b  TE_MAX_COLUMN ){
7250: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7260: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
7270: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f  o many columns o
7280: 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  n %s", p->zName)
7290: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
72a0: 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  }.  z = sqlite3N
72b0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
72c0: 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b  rse->db, pName);
72d0: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
72e0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
72f0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
7300: 7b 0a 20 20 20 20 69 66 28 20 53 54 52 49 43 4d  {.    if( STRICM
7310: 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  P(z, p->aCol[i].
7320: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
7330: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7340: 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61  pParse, "duplica
7350: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  te column name: 
7360: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73  %s", z);.      s
7370: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
7380: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
7390: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
73a0: 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30  ->nCol & 0x7)==0
73b0: 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a   ){.    Column *
73c0: 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d  aNew;.    aNew =
73d0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
73e0: 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 70 2d 3e  c(pParse->db,p->
73f0: 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29  aCol,(p->nCol+8)
7400: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b  *sizeof(p->aCol[
7410: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  0]));.    if( aN
7420: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
7430: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
7440: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
7450: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20    }.    p->aCol 
7460: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
7470: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
7480: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
7490: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
74a0: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
74b0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
74c0: 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  ;. .  /* If ther
74d0: 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65  e is no type spe
74e0: 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20  cified, columns 
74f0: 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74  have the default
7500: 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27   affinity.  ** '
7510: 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20  NONE'. If there 
7520: 69 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66  is a type specif
7530: 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65  ied, then sqlite
7540: 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29  3AddColumnType()
7550: 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61   will.  ** be ca
7560: 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74  lled next to set
7570: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
7580: 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a  correctly..  */.
7590: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
75a0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
75b0: 4e 45 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b  NE;.  p->nCol++;
75c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
75d0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
75e0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
75f0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
7600: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
7610: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
7620: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
7630: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
7640: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
7650: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
7660: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
7670: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
7680: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
7690: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
76a0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
76b0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
76c0: 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  ite3AddNotNull(P
76d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
76e0: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
76f0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
7700: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
7710: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
7720: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
7730: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
7740: 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f  f( i>=0 ) p->aCo
7750: 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f  l[i].notNull = o
7760: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
7770: 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e   Scan the column
7780: 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65   type name zType
7790: 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20   (length nType) 
77a0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  and return the.*
77b0: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66  * associated aff
77c0: 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a  inity type..**.*
77d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
77e0: 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70  oes a case-indep
77f0: 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66  endent search of
7800: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a   zType for the .
7810: 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  ** substrings in
7820: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
7830: 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20  able. If one of 
7840: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
7850: 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20  s.** found, the 
7860: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66  corresponding af
7870: 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e  finity is return
7880: 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e  ed. If zType con
7890: 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68  tains.** more th
78a0: 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  an one of the su
78b0: 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65  bstrings, entrie
78c0: 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70  s toward the top
78d0: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c   of .** the tabl
78e0: 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e  e take priority.
78f0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
7900: 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49   zType is 'BLOBI
7910: 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  NT', .** SQLITE_
7920: 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72  AFF_INTEGER is r
7930: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  eturned..**.** S
7940: 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41  ubstring     | A
7950: 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d  ffinity.** -----
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27  -----------.** '
7980: 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53  INT'         | S
7990: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
79a0: 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20  R.** 'CHAR'     
79b0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
79c0: 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20  TEXT.** 'CLOB'  
79d0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
79e0: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54  FF_TEXT.** 'TEXT
79f0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7a00: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42  E_AFF_TEXT.** 'B
7a10: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
7a20: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a  LITE_AFF_NONE.**
7a30: 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c   'REAL'        |
7a40: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
7a50: 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20  .** 'FLOA'      
7a60: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
7a70: 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20  EAL.** 'DOUB'   
7a80: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7a90: 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20  F_REAL.**.** If 
7aa0: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73  none of the subs
7ab0: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62  trings in the ab
7ac0: 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f  ove table are fo
7ad0: 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  und,.** SQLITE_A
7ae0: 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65  FF_NUMERIC is re
7af0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20  turned..*/.char 
7b00: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
7b10: 79 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  ype(const Token 
7b20: 2a 70 54 79 70 65 29 7b 0a 20 20 75 33 32 20 68  *pType){.  u32 h
7b30: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
7b40: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
7b50: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 75  MERIC;.  const u
7b60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
7b70: 6e 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a 20 20  n = pType->z;.  
7b80: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
7b90: 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70 54 79  har *zEnd = &pTy
7ba0: 70 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d 3b  pe->z[pType->n];
7bb0: 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d  ..  while( zIn!=
7bc0: 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d 20  zEnd ){.    h = 
7bd0: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
7be0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49  UpperToLower[*zI
7bf0: 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20  n];.    zIn++;. 
7c00: 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c     if( h==(('c'<
7c10: 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28  <24)+('h'<<16)+(
7c20: 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20  'a'<<8)+'r') ){ 
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7c40: 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  HAR */.      aff
7c50: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
7c60: 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20 69  XT; .    }else i
7c70: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
7c80: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
7c90: 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20  <8)+'b') ){     
7ca0: 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20    /* CLOB */.   
7cb0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7cc0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
7cd0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27  lse if( h==(('t'
7ce0: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
7cf0: 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('x'<<8)+'t') ){
7d00: 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a         /* TEXT *
7d10: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
7d20: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
7d30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
7d40: 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('b'<<24)+('l'<
7d50: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
7d60: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ')          /* B
7d70: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOB */.        &
7d80: 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  & (aff==SQLITE_A
7d90: 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66  FF_NUMERIC || af
7da0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f==SQLITE_AFF_RE
7db0: 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66  AL) ){.      aff
7dc0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
7dd0: 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  NE;.#ifndef SQLI
7de0: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
7df0: 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65  _POINT.    }else
7e00: 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32   if( h==(('r'<<2
7e10: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61  4)+('e'<<16)+('a
7e20: 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20  '<<8)+'l')      
7e30: 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20      /* REAL */. 
7e40: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
7e50: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
7e60: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
7e70: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
7e80: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7e90: 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27  h==(('f'<<24)+('
7ea0: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
7eb0: 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'a')          /
7ec0: 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20  * FLOA */.      
7ed0: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
7ee0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
7ef0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
7f00: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
7f10: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
7f20: 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31  'd'<<24)+('o'<<1
7f30: 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29  6)+('u'<<8)+'b')
7f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55            /* DOU
7f50: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
7f60: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
7f70: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
7f80: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7f90: 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20  F_REAL;.#endif. 
7fa0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26     }else if( (h&
7fb0: 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27  0x00FFFFFF)==(('
7fc0: 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29  i'<<16)+('n'<<8)
7fd0: 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49  +'t') ){    /* I
7fe0: 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  NT */.      aff 
7ff0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
8000: 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61  EGER;.      brea
8010: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
8020: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
8030: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8040: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
8050: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
8060: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
8070: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
8080: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
8090: 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73  ment.  The pFirs
80a0: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66  t token is the f
80b0: 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e  irst.** token in
80c0: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66   the sequence of
80d0: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73   tokens that des
80e0: 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f  cribe the type o
80f0: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
8100: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
8110: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20  construction.   
8120: 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73  pLast is the las
8130: 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68  t token.** in th
8140: 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65  e sequence.  Use
8150: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
8160: 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  n to construct a
8170: 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20   string.** that 
8180: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70  contains the typ
8190: 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c  ename of the col
81a0: 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  umn and store th
81b0: 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20  at string.** in 
81c0: 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20  zType..*/ .void 
81d0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
81e0: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
81f0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65  se, Token *pType
8200: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
8210: 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e   int i;.  Column
8220: 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 28   *pCol;..  if( (
8230: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
8240: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
8250: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
8260: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29  l-1;.  if( i<0 )
8270: 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20   return;.  pCol 
8280: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20  = &p->aCol[i];. 
8290: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
82a0: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 70 43  ol->zType);.  pC
82b0: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
82c0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
82d0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 79  (pParse->db, pTy
82e0: 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66  pe);.  pCol->aff
82f0: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41  inity = sqlite3A
8300: 66 66 69 6e 69 74 79 54 79 70 65 28 70 54 79 70  ffinityType(pTyp
8310: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
8320: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
8330: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
8340: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
8350: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
8360: 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61  umn.** of the ta
8370: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
8380: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
8390: 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20  ..**.** Default 
83a0: 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e  value expression
83b0: 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61  s must be consta
83c0: 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78  nt.  Raise an ex
83d0: 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a  ception if this.
83e0: 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  ** is not the ca
83f0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
8400: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8410: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
8420: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
8430: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
8440: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
8450: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
8460: 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66  id sqlite3AddDef
8470: 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20  aultValue(Parse 
8480: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
8490: 45 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Expr){.  Table *
84a0: 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  p;.  Column *pCo
84b0: 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  l;.  if( (p = pP
84c0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
84d0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20  !=0 ){.    pCol 
84e0: 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  = &(p->aCol[p->n
84f0: 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28  Col-1]);.    if(
8500: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
8510: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
8520: 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
8530: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8540: 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75  g(pParse, "defau
8550: 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75  lt value of colu
8560: 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63  mn [%s] is not c
8570: 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20  onstant",.      
8580: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29      pCol->zName)
8590: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
85a0: 20 20 20 45 78 70 72 20 2a 70 43 6f 70 79 3b 0a     Expr *pCopy;.
85b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
85c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
85d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
85e0: 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44  rDelete(pCol->pD
85f0: 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  flt);.      pCol
8600: 2d 3e 70 44 66 6c 74 20 3d 20 70 43 6f 70 79 20  ->pDflt = pCopy 
8610: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
8620: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
8630: 20 20 20 69 66 28 20 70 43 6f 70 79 20 29 7b 0a     if( pCopy ){.
8640: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
8650: 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 43  okenCopy(db, &pC
8660: 6f 70 79 2d 3e 73 70 61 6e 2c 20 26 70 45 78 70  opy->span, &pExp
8670: 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20  r->span);.      
8680: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
8690: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
86a0: 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
86b0: 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50   Designate the P
86c0: 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74  RIMARY KEY for t
86d0: 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74  he table.  pList
86e0: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61   is a list of na
86f0: 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d  mes .** of colum
8700: 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ns that form the
8710: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
8720: 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c  f pList is NULL,
8730: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73   then the.** mos
8740: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
8750: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74   column of the t
8760: 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d  able is the prim
8770: 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  ary key..**.** A
8780: 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20   table can have 
8790: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d  at most one prim
87a0: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65  ary key.  If the
87b0: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
87c0: 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20  as.** a primary 
87d0: 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73  key (and this is
87e0: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d   the second prim
87f0: 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72  ary key) then cr
8800: 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eate an.** error
8810: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
8820: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e  RIMARY KEY is on
8830: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
8840: 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20   whose datatype 
8850: 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74  is INTEGER,.** t
8860: 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20  hen we will try 
8870: 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75  to use that colu
8880: 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e  mn as the rowid.
8890: 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e    Set the Table.
88a0: 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f  iPKey.** field o
88b0: 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  f the table unde
88c0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74  r construction t
88d0: 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f  o be the index o
88e0: 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52  f the.** INTEGER
88f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
8900: 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65  umn.  Table.iPKe
8910: 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69  y is set to -1 i
8920: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  f there is.** no
8930: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
8940: 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   KEY..**.** If t
8950: 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e  he key is not an
8960: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
8970: 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74   KEY, then creat
8980: 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e  e a unique.** in
8990: 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e  dex for the key.
89a0: 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72    No index is cr
89b0: 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45  eated for INTEGE
89c0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a  R PRIMARY KEYs..
89d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
89e0: 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20  ddPrimaryKey(.  
89f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8a00: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
8a10: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
8a20: 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c  st *pList,  /* L
8a30: 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d  ist of field nam
8a40: 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  es to be indexed
8a50: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
8a60: 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  r,      /* What 
8a70: 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69  to do with a uni
8a80: 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74  queness conflict
8a90: 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e   */.  int autoIn
8aa0: 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  c,      /* True 
8ab0: 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45  if the AUTOINCRE
8ac0: 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20  MENT keyword is 
8ad0: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
8ae0: 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f   sortOrder     /
8af0: 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20  * SQLITE_SO_ASC 
8b00: 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  or SQLITE_SO_DES
8b10: 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  C */.){.  Table 
8b20: 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  *pTab = pParse->
8b30: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61  pNewTable;.  cha
8b40: 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  r *zType = 0;.  
8b50: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69  int iCol = -1, i
8b60: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
8b70: 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
8b80: 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72  AB ) goto primar
8b90: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66  y_key_exit;.  if
8ba0: 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b  ( pTab->hasPrimK
8bb0: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
8bc0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8bd0: 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20  , .      "table 
8be0: 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20  \"%s\" has more 
8bf0: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
8c00: 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   key", pTab->zNa
8c10: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72  me);.    goto pr
8c20: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
8c30: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50    }.  pTab->hasP
8c40: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66  rimKey = 1;.  if
8c50: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
8c60: 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e    iCol = pTab->n
8c70: 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61  Col - 1;.    pTa
8c80: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73  b->aCol[iCol].is
8c90: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d  PrimKey = 1;.  }
8ca0: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
8cb0: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
8cc0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  r; i++){.      f
8cd0: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
8ce0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
8cf0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
8d00: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
8d10: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
8d20: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e, pTab->aCol[iC
8d30: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ol].zName)==0 ){
8d40: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
8d50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8d60: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
8d70: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
8d80: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61  .        pTab->a
8d90: 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d  Col[iCol].isPrim
8da0: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Key = 1;.      }
8db0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
8dc0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20  List->nExpr>1 ) 
8dd0: 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  iCol = -1;.  }. 
8de0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
8df0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
8e00: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70  ){.    zType = p
8e10: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
8e20: 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28  zType;.  }.  if(
8e30: 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65   zType && sqlite
8e40: 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20  3StrICmp(zType, 
8e50: 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20  "INTEGER")==0.  
8e60: 20 20 20 20 20 20 26 26 20 73 6f 72 74 4f 72 64        && sortOrd
8e70: 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  er==SQLITE_SO_AS
8e80: 43 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69  C ){.    pTab->i
8e90: 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  PKey = iCol;.   
8ea0: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d   pTab->keyConf =
8eb0: 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 70 54   onError;.    pT
8ec0: 61 62 2d 3e 61 75 74 6f 49 6e 63 20 3d 20 61 75  ab->autoInc = au
8ed0: 74 6f 49 6e 63 3b 0a 20 20 7d 65 6c 73 65 20 69  toInc;.  }else i
8ee0: 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69  f( autoInc ){.#i
8ef0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8f00: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
8f10: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8f20: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54  Msg(pParse, "AUT
8f30: 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e  OINCREMENT is on
8f40: 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e  ly allowed on an
8f50: 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47   ".       "INTEG
8f60: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29  ER PRIMARY KEY")
8f70: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
8f80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
8f90: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
8fa0: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
8fb0: 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 2c 20   onError, 0, 0, 
8fc0: 73 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20  sortOrder, 0);. 
8fd0: 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20     pList = 0;.  
8fe0: 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  }..primary_key_e
8ff0: 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  xit:.  sqlite3Ex
9000: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  prListDelete(pLi
9010: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  st);.  return;.}
9020: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
9030: 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  w CHECK constrai
9040: 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  nt to the table 
9050: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
9060: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
9070: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
9080: 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28  CheckConstraint(
9090: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
90a0: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
90b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
90c0: 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f  r *pCheckExpr  /
90d0: 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72  * The check expr
90e0: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66  ession */.){.#if
90f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9100: 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a  _CHECK.  Table *
9110: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
9120: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69  NewTable;.  sqli
9130: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9140: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 54 61 62  ->db;.  if( pTab
9150: 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f   && !IN_DECLARE_
9160: 56 54 41 42 20 29 7b 0a 20 20 20 20 2f 2a 20 54  VTAB ){.    /* T
9170: 68 65 20 43 48 45 43 4b 20 65 78 70 72 65 73 73  he CHECK express
9180: 69 6f 6e 20 6d 75 73 74 20 62 65 20 64 75 70 6c  ion must be dupl
9190: 69 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  icated so that t
91a0: 6f 6b 65 6e 73 20 72 65 66 65 72 0a 20 20 20 20  okens refer.    
91b0: 2a 2a 20 74 6f 20 6d 61 6c 6c 6f 63 65 64 20 73  ** to malloced s
91c0: 70 61 63 65 20 61 6e 64 20 6e 6f 74 20 74 68 65  pace and not the
91d0: 20 28 65 70 68 65 6d 65 72 61 6c 29 20 74 65 78   (ephemeral) tex
91e0: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
91f0: 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 73 74 61  TABLE.    ** sta
9200: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 70 54  tement */.    pT
9210: 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c  ab->pCheck = sql
9220: 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
9230: 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 0a 20  pTab->pCheck, . 
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9260: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9270: 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 29  db, pCheckExpr))
9280: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
9290: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
92a0: 28 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 7d 0a  (pCheckExpr);.}.
92b0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
92c0: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
92d0: 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
92e0: 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61  cently parsed ta
92f0: 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f  ble column.** to
9300: 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76   the CollSeq giv
9310: 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  en..*/.void sqli
9320: 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70  te3AddCollateTyp
9330: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
9340: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
9350: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
9360: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43  nt i;.  char *zC
9370: 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
9380: 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61    /* Dequoted na
9390: 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20  me of collation 
93a0: 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 69  sequence */..  i
93b0: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
93c0: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
93d0: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
93e0: 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 7a 43 6f 6c  >nCol-1;..  zCol
93f0: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
9400: 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
9410: 3e 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  >db, pToken);.  
9420: 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
9430: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  urn;..  if( sqli
9440: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
9450: 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20  (pParse, zColl, 
9460: 2d 31 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  -1) ){.    Index
9470: 20 2a 70 49 64 78 3b 0a 20 20 20 20 70 2d 3e 61   *pIdx;.    p->a
9480: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a  Col[i].zColl = z
9490: 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  Coll;.  .    /* 
94a0: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  If the column is
94b0: 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e   declared as "<n
94c0: 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59  ame> PRIMARY KEY
94d0: 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22   COLLATE <type>"
94e0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e  ,.    ** then an
94f0: 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20   index may have 
9500: 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20  been created on 
9510: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f  this column befo
9520: 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  re the.    ** co
9530: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73  llation type was
9540: 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20   added. Correct 
9550: 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68  this if it is th
9560: 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  e case..    */. 
9570: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70     for(pIdx=p->p
9580: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
9590: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
95a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
95b0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  dx->nColumn==1 )
95c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
95d0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69  ->aiColumn[0]==i
95e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78   ){.        pIdx
95f0: 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d  ->azColl[0] = p-
9600: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[i].zColl;.
9610: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9620: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
9630: 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c 29 3b 0a  e3_free(zColl);.
9640: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
9650: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
9660: 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ns the collation
9670: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61   sequence for da
9680: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 65  tabase native te
9690: 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69  xt.** encoding i
96a0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
96b0: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c   string zName, l
96c0: 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a  ength nName..**.
96d0: 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
96e0: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ted collation se
96f0: 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76  quence is not av
9700: 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20  ailable, or not 
9710: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20  available.** in 
9720: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74  the database nat
9730: 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ive encoding, th
9740: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
9750: 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ory is invoked t
9760: 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e  o.** request it.
9770: 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   If the collatio
9780: 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e  n factory does n
9790: 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 61  ot supply such a
97a0: 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e   sequence,.** an
97b0: 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 69  d the sequence i
97c0: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  s available in a
97d0: 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f  nother text enco
97e0: 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20  ding, then that 
97f0: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  is.** returned i
9800: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
9810: 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   no versions of 
9820: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
9830: 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63  llations sequenc
9840: 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c  e are available,
9850: 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65   or.** another e
9860: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
9870: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
9880: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
9890: 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  ge written into.
98a0: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a  ** pParse..**.**
98b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
98c0: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
98d0: 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  d sqlite3FindCol
98e0: 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f  lSeq().  This ro
98f0: 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73  utine.** invokes
9900: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
9910: 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61  actory if the na
9920: 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61  med collation ca
9930: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a  nnot be found.**
9940: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61   and generates a
9950: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  n error message.
9960: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
9970: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
9980: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
9990: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
99a0: 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a  me, int nName){.
99b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
99c0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38  pParse->db;.  u8
99d0: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
99e0: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20    u8 initbusy = 
99f0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
9a00: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
9a10: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
9a20: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
9a30: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e  b, enc, zName, n
9a40: 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b  Name, initbusy);
9a50: 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79  .  if( !initbusy
9a60: 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21   && (!pColl || !
9a70: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a  pColl->xCmp) ){.
9a80: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
9a90: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64 62  te3GetCollSeq(db
9aa0: 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 2c 20  , pColl, zName, 
9ab0: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  nName);.    if( 
9ac0: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
9ad0: 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 7b 0a 20  if( nName<0 ){. 
9ae0: 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73         nName = s
9af0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
9b00: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
9b10: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9b20: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  se, "no such col
9b30: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a  lation sequence:
9b40: 20 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a   %.*s", nName, z
9b50: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f  Name);.      pCo
9b60: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ll = 0;.    }.  
9b70: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c  }..  return pCol
9b80: 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  l;.}.../*.** Gen
9b90: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
9ba0: 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74  will increment t
9bb0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
9bc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65  ..**.** The sche
9bd0: 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65  ma cookie is use
9be0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  d to determine w
9bf0: 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66  hen the schema f
9c00: 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  or the.** databa
9c10: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74  se changes.  Aft
9c20: 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63  er each schema c
9c30: 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69  hange, the cooki
9c40: 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67  e value.** chang
9c50: 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63  es.  When a proc
9c60: 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20  ess first reads 
9c70: 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65  the schema it re
9c80: 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f  cords the.** coo
9c90: 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72  kie.  Thereafter
9ca0: 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f  , whenever it go
9cb0: 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  es to access the
9cc0: 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74   database,.** it
9cd0: 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b   checks the cook
9ce0: 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ie to make sure 
9cf0: 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e  the schema has n
9d00: 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69  ot changed.** si
9d10: 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20  nce it was last 
9d20: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  read..**.** This
9d30: 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d   plan is not com
9d40: 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70  pletely bullet-p
9d50: 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73  roof.  It is pos
9d60: 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65  sible for.** the
9d70: 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67   schema to chang
9d80: 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  e multiple times
9d90: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f   and for the coo
9da0: 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74  kie to be.** set
9db0: 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76   back to prior v
9dc0: 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d  alue.  But schem
9dd0: 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e  a changes are in
9de0: 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20  frequent.** and 
9df0: 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
9e00: 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73  of hitting the s
9e10: 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ame cookie value
9e20: 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68   is only.** 1 ch
9e30: 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53  ance in 2^32.  S
9e40: 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f  o we're safe eno
9e50: 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ugh..*/.void sql
9e60: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
9e70: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
9e80: 62 65 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b  be *v, int iDb){
9e90: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
9ea0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
9eb0: 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  r, db->aDb[iDb].
9ec0: 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f  pSchema->schema_
9ed0: 63 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b 0a 20 20  cookie+1, 0);.  
9ee0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9ef0: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
9f00: 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  , iDb, 0);.}../*
9f10: 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20  .** Measure the 
9f20: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
9f30: 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f  ters needed to o
9f40: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a  utput the given.
9f50: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ** identifier.  
9f60: 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  The number retur
9f70: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79  ned includes any
9f80: 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20   quotes used.** 
9f90: 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  but does not inc
9fa0: 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65  lude the null te
9fb0: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  rminator..**.** 
9fc0: 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20  The estimate is 
9fd0: 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49  conservative.  I
9fe0: 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  t might be large
9ff0: 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a  r that what is.*
a000: 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e  * really needed.
a010: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
a020: 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74  dentLength(const
a030: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
a040: 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a   n;.  for(n=0; *
a050: 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20  z; n++, z++){.  
a060: 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b    if( *z=='"' ){
a070: 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65   n++; }.  }.  re
a080: 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f  turn n + 2;.}../
a090: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64  *.** Write an id
a0a0: 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68  entifier onto th
a0b0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76  e end of the giv
a0c0: 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a  en string.  Add.
a0d0: 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  ** quote charact
a0e0: 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ers as needed..*
a0f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
a100: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
a110: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
a120: 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a  *zSignedIdent){.
a130: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a140: 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67  *zIdent = (unsig
a150: 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65  ned char*)zSigne
a160: 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c  dIdent;.  int i,
a170: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
a180: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f   i = *pIdx;.  fo
a190: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
a1a0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
a1b0: 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  !isalnum(zIdent[
a1c0: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
a1d0: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
a1e0: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
a1f0: 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c    zIdent[j]!=0 |
a200: 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74  | isdigit(zIdent
a210: 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  [0]).           
a220: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
a230: 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64  3KeywordCode(zId
a240: 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a  ent, j)!=TK_ID;.
a250: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
a260: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
a270: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
a280: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
a290: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
a2a0: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
a2b0: 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69  nt[j]=='"' ) z[i
a2c0: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20  ++] = '"';.  }. 
a2d0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
a2e0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
a2f0: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
a300: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
a310: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
a320: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
a330: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
a340: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
a350: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
a360: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
a370: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
a380: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
a390: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
a3a0: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
a3b0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
a3c0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
a3d0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
a3e0: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54  reateTableStmt(T
a3f0: 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 69 73 54  able *p, int isT
a400: 65 6d 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b  emp){.  int i, k
a410: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
a420: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
a430: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c  , *zSep2, *zEnd,
a440: 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *z;.  Column *p
a450: 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  Col;.  n = 0;.  
a460: 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43  for(pCol = p->aC
a470: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
a480: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
a490: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
a4a0: 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61  Length(pCol->zNa
a4b0: 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f  me);.    z = pCo
a4c0: 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 69 66  l->zType;.    if
a4d0: 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b  ( z ){.      n +
a4e0: 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31  = (strlen(z) + 1
a4f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e  );.    }.  }.  n
a500: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
a510: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  p->zName);.  if(
a520: 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a 53 65   n<50 ){.    zSe
a530: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
a540: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
a550: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
a560: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
a570: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
a580: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
a590: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
a5a0: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
a5b0: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
a5c0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
a5d0: 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d   n );.  if( zStm
a5e0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
a5f0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
a600: 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 0a 20 20  ntf(n, zStmt,.  
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a620: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 26 26 69 73  !OMIT_TEMPDB&&is
a630: 54 65 6d 70 20 3f 20 22 43 52 45 41 54 45 20 54  Temp ? "CREATE T
a640: 45 4d 50 20 54 41 42 4c 45 20 22 3a 22 43 52 45  EMP TABLE ":"CRE
a650: 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20  ATE TABLE ");.  
a660: 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74  k = strlen(zStmt
a670: 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53  );.  identPut(zS
a680: 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d  tmt, &k, p->zNam
a690: 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d  e);.  zStmt[k++]
a6a0: 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43   = '(';.  for(pC
a6b0: 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b  ol=p->aCol, i=0;
a6c0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
a6d0: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 71   pCol++){.    sq
a6e0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
a6f0: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  -k, &zStmt[k], z
a700: 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  Sep);.    k += s
a710: 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29  trlen(&zStmt[k])
a720: 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65  ;.    zSep = zSe
a730: 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74  p2;.    identPut
a740: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c  (zStmt, &k, pCol
a750: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
a760: 28 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  ( (z = pCol->zTy
a770: 70 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  pe)!=0 ){.      
a780: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27  zStmt[k++] = ' '
a790: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a7a0: 73 74 72 6c 65 6e 28 7a 29 2b 6b 2b 31 3c 3d 6e  strlen(z)+k+1<=n
a7b0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
a7c0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20  3_snprintf(n-k, 
a7d0: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c  &zStmt[k], "%s",
a7e0: 20 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20   z);.      k += 
a7f0: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 7d  strlen(z);.    }
a800: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
a810: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
a820: 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45  tmt[k], "%s", zE
a830: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
a840: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  tmt;.}../*.** Th
a850: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
a860: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
a870: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
a880: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
a890: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
a8a0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
a8b0: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
a8c0: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
a8d0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
a8e0: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
a8f0: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
a900: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
a910: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
a920: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
a930: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
a940: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
a950: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
a960: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
a970: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
a980: 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73  , unless.** this
a990: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
a9a0: 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69  table or db->ini
a9b0: 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e  t.busy==1.  When
a9c0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
a9d0: 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65  1.** it means we
a9e0: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
a9f0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
aa00: 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20  able because we 
aa10: 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65  just.** connecte
aa20: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
aa30: 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  e or because the
aa40: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
aa50: 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65  able has.** rece
aa60: 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f  ntly changed, so
aa70: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
aa80: 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64  his table alread
aa90: 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74  y exists in.** t
aaa0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
aab0: 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e   table.  We do n
aac0: 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74  ot want to creat
aad0: 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  e it again..**.*
aae0: 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74  * If the pSelect
aaf0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
ab00: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
ab10: 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
ab20: 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20  e.** was called 
ab30: 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c  to create a tabl
ab40: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
ab50: 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54   a .** "CREATE T
ab60: 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  ABLE ... AS SELE
ab70: 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e  CT ..." statemen
ab80: 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e  t.  The column n
ab90: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ames of.** the n
aba0: 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61  ew table will ma
abb0: 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73  tch the result s
abc0: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
abd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
abe0: 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72  3EndTable(.  Par
abf0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ac00: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
ac10: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
ac20: 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20   *pCons,        
ac30: 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f     /* The ',' to
ac40: 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61  ken after the la
ac50: 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20  st column defn. 
ac60: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
ac70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
ac80: 54 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f  The final ')' to
ac90: 6b 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54  ken in the CREAT
aca0: 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c  E TABLE */.  Sel
acb0: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
acc0: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66       /* Select f
acd0: 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e  rom a "CREATE ..
ace0: 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a  . AS SELECT" */.
acf0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
ad00: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
ad10: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
ad20: 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 28 70 45   iDb;..  if( (pE
ad30: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
ad40: 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ==0) || pParse->
ad50: 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
ad60: 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20 20 20  ocFailed ) {.   
ad70: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
ad80: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
ad90: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
ada0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
adb0: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
adc0: 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74  busy || !pSelect
add0: 20 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c   );..  iDb = sql
ade0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
adf0: 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
ae00: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
ae10: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
ae20: 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  /* Resolve names
ae30: 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f   in all CHECK co
ae40: 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65 73 73  nstraint express
ae50: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
ae60: 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20   p->pCheck ){.  
ae70: 20 20 53 72 63 4c 69 73 74 20 73 53 72 63 3b 20    SrcList sSrc; 
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae90: 20 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69 73    /* Fake SrcLis
aea0: 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e  t for pParse->pN
aeb0: 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4e  ewTable */.    N
aec0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aee0: 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
aef0: 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  or pParse->pNewT
af00: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d  able */..    mem
af10: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
af20: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 6d  eof(sNC));.    m
af30: 65 6d 73 65 74 28 26 73 53 72 63 2c 20 30 2c 20  emset(&sSrc, 0, 
af40: 73 69 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a 20  sizeof(sSrc));. 
af50: 20 20 20 73 53 72 63 2e 6e 53 72 63 20 3d 20 31     sSrc.nSrc = 1
af60: 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e  ;.    sSrc.a[0].
af70: 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65  zName = p->zName
af80: 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e  ;.    sSrc.a[0].
af90: 70 54 61 62 20 3d 20 70 3b 0a 20 20 20 20 73 53  pTab = p;.    sS
afa0: 72 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20  rc.a[0].iCursor 
afb0: 3d 20 2d 31 3b 0a 20 20 20 20 73 4e 43 2e 70 50  = -1;.    sNC.pP
afc0: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
afd0: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
afe0: 3d 20 26 73 53 72 63 3b 0a 20 20 20 20 73 4e 43  = &sSrc;.    sNC
aff0: 2e 69 73 43 68 65 63 6b 20 3d 20 31 3b 0a 20 20  .isCheck = 1;.  
b000: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
b010: 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
b020: 4e 43 2c 20 70 2d 3e 70 43 68 65 63 6b 29 20 29  NC, p->pCheck) )
b030: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
b040: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
b050: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
b060: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20  ITE_OMIT_CHECK) 
b070: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  */..  /* If the 
b080: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
b090: 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61   1 it means we a
b0a0: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53  re reading the S
b0b0: 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20  QL off the.  ** 
b0c0: 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
b0d0: 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  or "sqlite_temp_
b0e0: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
b0f0: 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20   the disk..  ** 
b100: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
b110: 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69  to the disk agai
b120: 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
b130: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
b140: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  .  ** for the ta
b150: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ble from the db-
b160: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69  >init.newTnum fi
b170: 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
b180: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75  number.  ** shou
b190: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74  ld have been put
b1a0: 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
b1b0: 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
b1c0: 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ne.).  */.  if( 
b1d0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
b1e0: 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64  .    p->tnum = d
b1f0: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
b200: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
b210: 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20  t initializing, 
b220: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65  then create a re
b230: 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77  cord for the new
b240: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74   table.  ** in t
b250: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
b260: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61   table of the da
b270: 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65 63  tabase.  The rec
b280: 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  ord number.  ** 
b290: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
b2a0: 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61  e entry should a
b2b0: 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65  lready be on the
b2c0: 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a   stack..  **.  *
b2d0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54  * If this is a T
b2e0: 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20  EMPORARY table, 
b2f0: 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20  write the entry 
b300: 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61  into the auxilia
b310: 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73  ry.  ** file ins
b320: 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65  tead of into the
b330: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
b340: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
b350: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
b360: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
b370: 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
b380: 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a  ar *zType;    /*
b390: 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c   "view" or "tabl
b3a0: 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  e" */.    char *
b3b0: 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49  zType2;   /* "VI
b3c0: 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a  EW" or "TABLE" *
b3d0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d  /.    char *zStm
b3e0: 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  t;    /* Text of
b3f0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
b400: 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45 57  E or CREATE VIEW
b410: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20   statement */.. 
b420: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
b430: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
b440: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
b450: 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74  turn;..    sqlit
b460: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b470: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
b480: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
b490: 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20  he rootpage for 
b4a0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 61 6e  the new table an
b4b0: 64 20 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74  d push it onto t
b4c0: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a  he stack..    **
b4d0: 20 41 20 76 69 65 77 20 68 61 73 20 6e 6f 20 72   A view has no r
b4e0: 6f 6f 74 70 61 67 65 2c 20 73 6f 20 6a 75 73 74  ootpage, so just
b4f0: 20 70 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e 74   push a zero ont
b500: 6f 20 74 68 65 20 73 74 61 63 6b 20 66 6f 72 0a  o the stack for.
b510: 20 20 20 20 2a 2a 20 76 69 65 77 73 2e 20 20 49      ** views.  I
b520: 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20  nitialize zType 
b530: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
b540: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
b550: 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
b560: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
b570: 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
b580: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62      zType = "tab
b590: 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  le";.      zType
b5a0: 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66  2 = "TABLE";.#if
b5b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b5c0: 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b  _VIEW.    }else{
b5d0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
b5e0: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
b5f0: 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
b600: 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
b610: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
b620: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
b630: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
b640: 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
b650: 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
b660: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
b670: 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
b680: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
b690: 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
b6a0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
b6b0: 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
b6c0: 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  s on the top of 
b6d0: 74 68 65 20 76 64 62 65 20 73 74 61 63 6b 2e 0a  the vdbe stack..
b6e0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
b6f0: 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61  ce the SELECT ha
b700: 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20  s been coded by 
b710: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c  sqlite3Select(),
b720: 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20   it is in a.    
b730: 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74  ** suitable stat
b740: 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74  e to query for t
b750: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
b760: 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20  and types to be 
b770: 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  used.    ** by t
b780: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20  he new table..  
b790: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68    **.    ** A sh
b7a0: 61 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65  ared-cache write
b7b0: 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71  -lock is not req
b7c0: 75 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74  uired to write t
b7d0: 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c  o the new table,
b7e0: 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68  .    ** as a sch
b7f0: 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61  ema-lock must ha
b800: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
b810: 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61  obtained to crea
b820: 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20  te it. Since.   
b830: 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   ** a schema-loc
b840: 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f  k excludes all o
b850: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73  ther database us
b860: 65 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c  ers, the write-l
b870: 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a  ock would.    **
b880: 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20   be redundant.. 
b890: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
b8a0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 54  elect ){.      T
b8b0: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20  able *pSelTab;. 
b8c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b8d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
b8e0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
b8f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b900: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44  , OP_Integer, iD
b910: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, 0);.      sql
b920: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b930: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
b940: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
b950: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
b960: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
b970: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
b980: 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c  t, SRT_Table, 1,
b990: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
b9a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b9b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
b9c0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 1, 0);.      i
b9d0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
b9e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  =0 ){.        pS
b9f0: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
ba00: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
ba10: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c  (pParse, 0, pSel
ba20: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ect);.        if
ba30: 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72  ( pSelTab==0 ) r
ba40: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61  eturn;.        a
ba50: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d  ssert( p->aCol==
ba60: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 );.        p->
ba70: 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
ba80: 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d  nCol;.        p-
ba90: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
baa0: 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  >aCol;.        p
bab0: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
bac0: 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  ;.        pSelTa
bad0: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
bae0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
baf0: 74 65 54 61 62 6c 65 28 70 53 65 6c 54 61 62 29  teTable(pSelTab)
bb00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bb10: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
bb20: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
bb30: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
bb40: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
bb50: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
bb60: 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72        zStmt = cr
bb70: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70 2c  eateTableStmt(p,
bb80: 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d   p->pSchema==db-
bb90: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
bba0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
bbb0: 20 20 20 6e 20 3d 20 70 45 6e 64 2d 3e 7a 20 2d     n = pEnd->z -
bbc0: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
bbd0: 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20 20 20  ken.z + 1;.     
bbe0: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
bbf0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20  MPrintf(db, .   
bc00: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25         "CREATE %
bc10: 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c  s %.*s", zType2,
bc20: 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d   n, pParse->sNam
bc30: 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29  eToken.z.      )
bc40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
bc50: 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72  A slot for the r
bc60: 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64  ecord has alread
bc70: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
bc80: 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   in the .    ** 
bc90: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
bca0: 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65  ble.  We just ne
bcb0: 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61  ed to update tha
bcc0: 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a  t slot with all.
bcd0: 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72      ** the infor
bce0: 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c  mation we've col
bcf0: 6c 65 63 74 65 64 2e 20 20 54 68 65 20 72 6f 77  lected.  The row
bd00: 69 64 20 66 6f 72 20 74 68 65 20 70 72 65 61 6c  id for the preal
bd10: 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 73  located.    ** s
bd20: 6c 6f 74 20 69 73 20 74 68 65 20 32 6e 64 20 69  lot is the 2nd i
bd30: 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
bd40: 2e 20 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  .  The top of th
bd50: 65 20 73 74 61 63 6b 20 69 73 20 74 68 65 0a 20  e stack is the. 
bd60: 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20     ** root page 
bd70: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
bd80: 65 20 28 6f 72 20 61 20 30 20 69 66 20 74 68 69  e (or a 0 if thi
bd90: 73 20 69 73 20 61 20 76 69 65 77 29 2e 0a 20 20  s is a view)..  
bda0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
bdb0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
bdc0: 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54  se,.      "UPDAT
bdd0: 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20  E %Q.%s ".      
bde0: 20 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73     "SET type='%s
bdf0: 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f  ', name=%Q, tbl_
be00: 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67  name=%Q, rootpag
be10: 65 3d 23 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20  e=#0, sql=%Q ". 
be20: 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77        "WHERE row
be30: 69 64 3d 23 31 22 2c 0a 20 20 20 20 20 20 64 62  id=#1",.      db
be40: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
be50: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
be60: 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65  Db),.      zType
be70: 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65  ,.      p->zName
be80: 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65  ,.      p->zName
be90: 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20  ,.      zStmt.  
bea0: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
beb0: 5f 66 72 65 65 28 7a 53 74 6d 74 29 3b 0a 20 20  _free(zStmt);.  
bec0: 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
bed0: 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62  ookie(db, v, iDb
bee0: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
bef0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
bf00: 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65  EMENT.    /* Che
bf10: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
bf20: 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  need to create a
bf30: 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  n sqlite_sequenc
bf40: 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20  e table for.    
bf50: 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b  ** keeping track
bf60: 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   of autoincremen
bf70: 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20  t keys..    */. 
bf80: 20 20 20 69 66 28 20 70 2d 3e 61 75 74 6f 49 6e     if( p->autoIn
bf90: 63 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70  c ){.      Db *p
bfa0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
bfb0: 62 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  b];.      if( pD
bfc0: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  b->pSchema->pSeq
bfd0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
bfe0: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
bff0: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
c000: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
c010: 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73  ABLE %Q.sqlite_s
c020: 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71  equence(name,seq
c030: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  )",.          pD
c040: 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20  b->zName.       
c050: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
c060: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
c070: 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68   Reparse everyth
c080: 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75  ing to update ou
c090: 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  r internal data 
c0a0: 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20  structures */.  
c0b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
c0c0: 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (v, OP_ParseSche
c0d0: 6d 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20 20 20  ma, iDb, 0,.    
c0e0: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
c0f0: 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65  tf(db, "tbl_name
c100: 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29  ='%q'",p->zName)
c110: 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P3_DYNAMIC);. 
c120: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68   }...  /* Add th
c130: 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
c140: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
c150: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
c160: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
c170: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
c180: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  y && pParse->nEr
c190: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c  r==0 ){.    Tabl
c1a0: 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65  e *pOld;.    FKe
c1b0: 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 53  y *pFKey; .    S
c1c0: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
c1d0: 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20   p->pSchema;.   
c1e0: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
c1f0: 61 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65  ashInsert(&pSche
c200: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e  ma->tblHash, p->
c210: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d  zName, strlen(p-
c220: 3e 7a 4e 61 6d 65 29 2b 31 2c 70 29 3b 0a 20 20  >zName)+1,p);.  
c230: 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
c240: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
c250: 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  Old );  /* Mallo
c260: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
c270: 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e  ed inside HashIn
c280: 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  sert() */.      
c290: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c2a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
c2b0: 72 6e 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  rn;.    }.#ifnde
c2c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
c2d0: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f  REIGN_KEY.    fo
c2e0: 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79  r(pFKey=p->pFKey
c2f0: 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70  ; pFKey; pFKey=p
c300: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29  FKey->pNextFrom)
c310: 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 64 61  {.      void *da
c320: 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  ta;.      int nT
c330: 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65 79  o = strlen(pFKey
c340: 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20  ->zTo) + 1;.    
c350: 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
c360: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
c370: 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b  nd(&pSchema->aFK
c380: 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  ey, pFKey->zTo, 
c390: 6e 54 6f 29 3b 0a 20 20 20 20 20 20 64 61 74 61  nTo);.      data
c3a0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
c3b0: 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 61  sert(&pSchema->a
c3c0: 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f  FKey, pFKey->zTo
c3d0: 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20  , nTo, pFKey);. 
c3e0: 20 20 20 20 20 69 66 28 20 64 61 74 61 3d 3d 28       if( data==(
c3f0: 76 6f 69 64 20 2a 29 70 46 4b 65 79 20 29 7b 0a  void *)pFKey ){.
c400: 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c          db->mall
c410: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
c420: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
c430: 69 66 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  if.    pParse->p
c440: 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  NewTable = 0;.  
c450: 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a    db->nTable++;.
c460: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
c470: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
c480: 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  anges;..#ifndef 
c490: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45  SQLITE_OMIT_ALTE
c4a0: 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21  RTABLE.    if( !
c4b0: 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  p->pSelect ){.  
c4c0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c4d0: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
c4e0: 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e  har *)pParse->sN
c4f0: 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20  ameToken.z;.    
c500: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20    int nName;.   
c510: 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65 6c     assert( !pSel
c520: 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20  ect && pCons && 
c530: 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66  pEnd );.      if
c540: 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b  ( pCons->z==0 ){
c550: 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d  .        pCons =
c560: 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20   pEnd;.      }. 
c570: 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 63 6f       nName = (co
c580: 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73  nst char *)pCons
c590: 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ->z - zName;.   
c5a0: 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73     p->addColOffs
c5b0: 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65  et = 13 + sqlite
c5c0: 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61  3Utf8CharLen(zNa
c5d0: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
c5e0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
c5f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c600: 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54  MIT_VIEW./*.** T
c610: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
c620: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20  this routine in 
c630: 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20  order to create 
c640: 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f  a new VIEW.*/.vo
c650: 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
c660: 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  View(.  Parse *p
c670: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
c680: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
c690: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42  t */.  Token *pB
c6a0: 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65  egin,     /* The
c6b0: 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
c6c0: 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74  at begins the st
c6d0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
c6e0: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
c6f0: 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
c700: 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
c710: 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
c720: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
c730: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
c740: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
c750: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
c760: 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  w */.  Select *p
c770: 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53  Select,   /* A S
c780: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
c790: 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
c7a0: 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f   the new view */
c7b0: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
c7c0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f        /* TRUE fo
c7d0: 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69  r a TEMPORARY vi
c7e0: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72  ew */.  int noEr
c7f0: 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  r          /* Su
c800: 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73  ppress error mes
c810: 73 61 67 65 73 20 69 66 20 56 49 45 57 20 61 6c  sages if VIEW al
c820: 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
c830: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
c840: 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20   int n;.  const 
c850: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
c860: 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
c870: 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
c880: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a    Token *pName;.
c890: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c    int iDb;.  sql
c8a0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
c8b0: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
c8c0: 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a  arse->nVar>0 ){.
c8d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c8e0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72  Msg(pParse, "par
c8f0: 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20  ameters are not 
c900: 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73  allowed in views
c910: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ");.    sqlite3S
c920: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
c930: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
c940: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
c950: 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
c960: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
c970: 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20  , isTemp, 1, 0, 
c980: 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50  noErr);.  p = pP
c990: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
c9a0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
c9b0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
c9c0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
c9d0: 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b  Delete(pSelect);
c9e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
c9f0: 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  .  sqlite3TwoPar
ca00: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
ca10: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
ca20: 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73  Name);.  iDb = s
ca30: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
ca40: 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65  dex(db, p->pSche
ca50: 6d 61 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ma);.  if( sqlit
ca60: 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
ca70: 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76   pParse, iDb, "v
ca80: 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20  iew", pName).   
ca90: 20 26 26 20 73 71 6c 69 74 65 33 46 69 78 53 65   && sqlite3FixSe
caa0: 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c  lect(&sFix, pSel
cab0: 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  ect).  ){.    sq
cac0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
cad0: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  e(pSelect);.    
cae0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
caf0: 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
cb00: 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45   the entire SELE
cb10: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
cb20: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
cb30: 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69  ew..  ** This wi
cb40: 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65  ll force all the
cb50: 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61   Expr.token.z va
cb60: 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d  lues to be dynam
cb70: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  ically.  ** allo
cb80: 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61  cated rather tha
cb90: 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69  n point to the i
cba0: 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68  nput string - wh
cbb0: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  ich means that. 
cbc0: 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65   ** they will pe
cbd0: 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20  rsist after the 
cbe0: 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f  current sqlite3_
cbf0: 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75  exec() call retu
cc00: 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  rns..  */.  p->p
cc10: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
cc20: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53  SelectDup(db, pS
cc30: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
cc40: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
cc50: 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62  elect);.  if( db
cc60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
cc70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
cc80: 7d 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  }.  if( !db->ini
cc90: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71  t.busy ){.    sq
cca0: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
ccb0: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
ccc0: 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  p);.  }..  /* Lo
ccd0: 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  cate the end of 
cce0: 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20  the CREATE VIEW 
ccf0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65  statement.  Make
cd00: 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20   sEnd point to. 
cd10: 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a   ** the end..  *
cd20: 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  /.  sEnd = pPars
cd30: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
cd40: 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d   if( sEnd.z[0]!=
cd50: 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d  0 && sEnd.z[0]!=
cd60: 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
cd70: 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
cd80: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
cd90: 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42   n = sEnd.z - pB
cda0: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28  egin->z;.  z = (
cdb0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
cdc0: 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a  har*)pBegin->z;.
cdd0: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
cde0: 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20  (z[n-1]==';' || 
cdf0: 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29  isspace(z[n-1]))
ce00: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e   ){ n--; }.  sEn
ce10: 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20  d.z = &z[n-1];. 
ce20: 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20   sEnd.n = 1;..  
ce30: 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e  /* Use sqlite3En
ce40: 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20  dTable() to add 
ce50: 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20  the view to the 
ce60: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
ce70: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
ce80: 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
ce90: 20 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20   0, &sEnd, 0);. 
cea0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
ceb0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
cec0: 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64  _VIEW */..#if !d
ced0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
cee0: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
cef0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
cf00: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f  _VIRTUALTABLE)./
cf10: 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
cf20: 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20  tructure pTable 
cf30: 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57  is really a VIEW
cf40: 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e  .  Fill in the n
cf50: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63  ames of.** the c
cf60: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69  olumns of the vi
cf70: 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65  ew in the pTable
cf80: 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74   structure.  Ret
cf90: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a  urn the number.*
cfa0: 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  * of errors.  If
cfb0: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
cfc0: 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  n leave an error
cfd0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
cfe0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  se->zErrMsg..*/.
cff0: 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77 47  int sqlite3ViewG
d000: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61  etColumnNames(Pa
d010: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
d020: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54  le *pTable){.  T
d030: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20  able *pSelTab;  
d040: 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65   /* A fake table
d050: 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67   from which we g
d060: 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  et the result se
d070: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
d080: 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79  Sel;     /* Copy
d090: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 74   of the SELECT t
d0a0: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
d0b0: 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  he view */.  int
d0c0: 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f   nErr = 0;     /
d0d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  * Number of erro
d0e0: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a  rs encountered *
d0f0: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
d100: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
d110: 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e  rily holds the n
d120: 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
d130: 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73   assigned */.  s
d140: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
d150: 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
d160: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
d170: 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f   for malloc erro
d180: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 41  rs */.  int (*xA
d190: 75 74 68 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  uth)(void*,int,c
d1a0: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
d1b0: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
d1c0: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  r*,const char*);
d1d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
d1e0: 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  le );..#ifndef S
d1f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
d200: 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 73 71  ALTABLE.  if( sq
d210: 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e  lite3VtabCallCon
d220: 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61  nect(pParse, pTa
d230: 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ble) ){.    retu
d240: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
d250: 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72  .  }.  if( IsVir
d260: 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72  tual(pTable) ) r
d270: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
d280: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d290: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41  OMIT_VIEW.  /* A
d2a0: 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d   positive nCol m
d2b0: 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73  eans the columns
d2c0: 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
d2d0: 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c  view are.  ** al
d2e0: 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a  ready known..  *
d2f0: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
d300: 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20  nCol>0 ) return 
d310: 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74  0;..  /* A negat
d320: 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70  ive nCol is a sp
d330: 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61  ecial marker mea
d340: 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65  ning that we are
d350: 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
d360: 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74  trying to comput
d370: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
d380: 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72  es.  If we enter
d390: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
d3a0: 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69  th.  ** a negati
d3b0: 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e  ve nCol, it mean
d3c0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69  s two or more vi
d3d0: 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c  ews form a loop,
d3e0: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
d3f0: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
d400: 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c   VIEW one AS SEL
d410: 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a  ECT * FROM two;.
d420: 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
d430: 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45  VIEW two AS SELE
d440: 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20  CT * FROM one;. 
d450: 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
d460: 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69 73  y, this error is
d470: 20 63 61 75 67 68 74 20 70 72 65 76 69 6f 75 73   caught previous
d480: 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f  ly and so the fo
d490: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a  llowing test.  *
d4a0: 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  * should always 
d4b0: 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69  fail.  But we wi
d4c0: 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70  ll leave it in p
d4d0: 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20  lace just to be 
d4e0: 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  safe..  */.  if(
d4f0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20   pTable->nCol<0 
d500: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d510: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d520: 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75  view %s is circu
d530: 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20  larly defined", 
d540: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
d550: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
d560: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  }.  assert( pTab
d570: 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a  le->nCol>=0 );..
d580: 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
d590: 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
d5a0: 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d  s we need to com
d5b0: 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e  pute the table n
d5c0: 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20  ames..  ** Note 
d5d0: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
d5e0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
d5f0: 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c  tOfSelect() will
d600: 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a   expand any.  **
d610: 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e   "*" elements in
d620: 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65 74   the results set
d630: 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e 64   of the view and
d640: 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72   will assign cur
d650: 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  sors.  ** to the
d660: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
d670: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42   FROM clause.  B
d680: 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e  ut we do not wan
d690: 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a  t these changes.
d6a0: 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61    ** to be perma
d6b0: 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f  nent.  So the co
d6c0: 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e  mputation is don
d6d0: 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  e on a copy of t
d6e0: 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73  he SELECT.  ** s
d6f0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
d700: 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
d710: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
d720: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
d730: 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74  ;.  pSel = sqlit
d740: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
d750: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29  pTable->pSelect)
d760: 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a  ;.  if( pSel ){.
d770: 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e      n = pParse->
d780: 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  nTab;.    sqlite
d790: 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
d7a0: 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53  rsors(pParse, pS
d7b0: 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70  el->pSrc);.    p
d7c0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31  Table->nCol = -1
d7d0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
d7e0: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
d7f0: 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20  ION.    xAuth = 
d800: 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64  db->xAuth;.    d
d810: 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20  b->xAuth = 0;.  
d820: 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
d830: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
d840: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lect(pParse, 0, 
d850: 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78  pSel);.    db->x
d860: 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65  Auth = xAuth;.#e
d870: 6c 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20  lse.    pSelTab 
d880: 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
d890: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
d8a0: 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 23 65 6e  e, 0, pSel);.#en
d8b0: 64 69 66 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  dif.    pParse->
d8c0: 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66  nTab = n;.    if
d8d0: 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20  ( pSelTab ){.   
d8e0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c     assert( pTabl
d8f0: 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  e->aCol==0 );.  
d900: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
d910: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
d920: 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
d930: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
d940: 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c  aCol;.      pSel
d950: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
d960: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
d970: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ol = 0;.      sq
d980: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
d990: 28 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20  (pSelTab);.     
d9a0: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
d9b0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e  ->flags |= DB_Un
d9c0: 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20 20  resetViews;.    
d9d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
d9e0: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
d9f0: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
da00: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
da10: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 29  lectDelete(pSel)
da20: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
da30: 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e   nErr++;.  }.#en
da40: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
da50: 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74  IT_VIEW */.  ret
da60: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65  urn nErr;  .}.#e
da70: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
da80: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
da90: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
daa0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
dab0: 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66  ALTABLE) */..#if
dac0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
dad0: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  _VIEW./*.** Clea
dae0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
daf0: 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49  es from every VI
db00: 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  EW in database i
db10: 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  dx..*/.static vo
db20: 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  id sqliteViewRes
db30: 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  etAll(sqlite3 *d
db40: 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48  b, int idx){.  H
db50: 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66  ashElem *i;.  if
db60: 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  ( !DbHasProperty
db70: 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
db80: 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74  esetViews) ) ret
db90: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  urn;.  for(i=sql
dba0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
dbb0: 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65  ->aDb[idx].pSche
dbc0: 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b  ma->tblHash); i;
dbd0: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
dbe0: 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  (i)){.    Table 
dbf0: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
dc00: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
dc10: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
dc20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
dc30: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
dc40: 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTab);.    }.  
dc50: 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65  }.  DbClearPrope
dc60: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
dc70: 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d  UnresetViews);.}
dc80: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
dc90: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
dca0: 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f  ll(A,B).#endif /
dcb0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
dcc0: 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  EW */../*.** Thi
dcd0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
dce0: 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45  lled by the VDBE
dcf0: 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69   to adjust the i
dd00: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
dd10: 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65  * used by SQLite
dd20: 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20   when the btree 
dd30: 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61  layer moves a ta
dd40: 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54  ble root page. T
dd50: 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20  he.** root-page 
dd60: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
dd70: 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20  dex in database 
dd80: 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20  iDb has changed 
dd90: 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f  from iFrom.** to
dda0: 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b   iTo..**.** Tick
ddb0: 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73  et #1728:  The s
ddc0: 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68  ymbol table migh
ddd0: 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  t still contain 
dde0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f  information.** o
ddf0: 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20  n tables and/or 
de00: 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65  indices that are
de10: 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
de20: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a  being deleted..*
de30: 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c  * If you are unl
de40: 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f  ucky, one of tho
de50: 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  se deleted indic
de60: 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67  es or tables mig
de70: 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73  ht.** have the s
de80: 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d  ame rootpage num
de90: 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20  ber as the real 
dea0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
deb0: 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20  hat is.** being 
dec0: 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61  moved.  So we ca
ded0: 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68  nnot stop search
dee0: 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69  ing after the fi
def0: 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65  rst match .** be
df00: 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20  cause the first 
df10: 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66  match might be f
df20: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65  or one of the de
df30: 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a  leted indices.**
df40: 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e   or tables and n
df50: 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64  ot the table/ind
df60: 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61  ex that is actua
df70: 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e  lly being moved.
df80: 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74  .** We must cont
df90: 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74  inue looping unt
dfa0: 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e  il all tables an
dfb0: 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a  d indices with.*
dfc0: 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f  * rootpage==iFro
dfd0: 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76  m have been conv
dfe0: 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20  erted to have a 
dff0: 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a  rootpage of iTo.
e000: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ** in order to b
e010: 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77  e certain that w
e020: 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20  e got the right 
e030: 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  one..*/.#ifndef 
e040: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
e050: 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69  VACUUM.void sqli
e060: 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64  te3RootPageMoved
e070: 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46  (Db *pDb, int iF
e080: 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
e090: 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d   HashElem *pElem
e0a0: 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b  ;.  Hash *pHash;
e0b0: 0a 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  ..  pHash = &pDb
e0c0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
e0d0: 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
e0e0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
e0f0: 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
e100: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
e110: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
e120: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
e130: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
e140: 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54  lem);.    if( pT
e150: 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  ab->tnum==iFrom 
e160: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  ){.      pTab->t
e170: 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
e180: 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26  .  }.  pHash = &
e190: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  pDb->pSchema->id
e1a0: 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  xHash;.  for(pEl
e1b0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
e1c0: 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
e1d0: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
e1e0: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
e1f0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
e200: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
e210: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
e220: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pIdx->tnum==iFr
e230: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  om ){.      pIdx
e240: 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
e250: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
e260: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f  ../*.** Write co
e270: 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20  de to erase the 
e280: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
e290: 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d  page iTable from
e2a0: 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a   database iDb..*
e2b0: 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64  * Also write cod
e2c0: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
e2d0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
e2e0: 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  ble and internal
e2f0: 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20   schema.** if a 
e300: 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f  root-page of ano
e310: 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
e320: 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
e330: 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a  -layer whilst.**
e340: 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20   erasing iTable 
e350: 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
e360: 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
e370: 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
e380: 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
e390: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
e3a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
e3b0: 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69  nt iTable, int i
e3c0: 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
e3d0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
e3e0: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
e3f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e400: 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c  P_Destroy, iTabl
e410: 65 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66  e, iDb);.#ifndef
e420: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
e430: 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f  OVACUUM.  /* OP_
e440: 44 65 73 74 72 6f 79 20 70 75 73 68 65 73 20 61  Destroy pushes a
e450: 6e 20 69 6e 74 65 67 65 72 20 6f 6e 74 6f 20 74  n integer onto t
e460: 68 65 20 73 74 61 63 6b 2e 20 49 66 20 74 68 69  he stack. If thi
e470: 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69  s integer.  ** i
e480: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
e490: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
e4a0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
e4b0: 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a   table moved to.
e4c0: 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54    ** location iT
e4d0: 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  able. The follow
e4e0: 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65  ing code modifie
e4f0: 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  s the sqlite_mas
e500: 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a  ter table to.  *
e510: 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a  * reflect this..
e520: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23    **.  ** The "#
e530: 30 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73  0" in the SQL is
e540: 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74   a special const
e550: 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ant that means w
e560: 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20  hatever value.  
e570: 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70  ** is on the top
e580: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20   of the stack.  
e590: 53 65 65 20 73 71 6c 69 74 65 33 52 65 67 69 73  See sqlite3Regis
e5a0: 74 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a  terExpr()..  */.
e5b0: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
e5c0: 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
e5d0: 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
e5e0: 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64   SET rootpage=%d
e5f0: 20 57 48 45 52 45 20 23 30 20 41 4e 44 20 72 6f   WHERE #0 AND ro
e600: 6f 74 70 61 67 65 3d 23 30 22 2c 0a 20 20 20 20  otpage=#0",.    
e610: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
e620: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
e630: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
e640: 69 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  iTable);.#endif.
e650: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56  }../*.** Write V
e660: 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73  DBE code to eras
e670: 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  e table pTab and
e680: 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
e690: 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e  indices on disk.
e6a0: 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61  .** Code to upda
e6b0: 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  te the sqlite_ma
e6c0: 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20  ster tables and 
e6d0: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
e6e0: 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69  definitions.** i
e6f0: 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61  n case a root-pa
e700: 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
e710: 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
e720: 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
e730: 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20  ree layer.** is 
e740: 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73  also added (this
e750: 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
e760: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
e770: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
e780: 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
e790: 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  yTable(Parse *pP
e7a0: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
e7b0: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
e7c0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
e7d0: 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  M.  Index *pIdx;
e7e0: 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
e7f0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
e800: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
e810: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
e820: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
e830: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e  pParse, pTab->tn
e840: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28  um, iDb);.  for(
e850: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
e860: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
e870: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
e880: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
e890: 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e  pParse, pIdx->tn
e8a0: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65  um, iDb);.  }.#e
e8b0: 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  lse.  /* If the 
e8c0: 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
e8d0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
e8e0: 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f  ble (if SQLITE_O
e8f0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
e900: 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e   ** is not defin
e910: 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ed), then it is 
e920: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c  important to cal
e930: 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20  l OP_Destroy on 
e940: 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61  the.  ** table a
e950: 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61  nd index root-pa
e960: 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74  ges in order, st
e970: 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
e980: 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a  numerically .  *
e990: 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  * largest root-p
e9a0: 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
e9b0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
e9c0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f   none of the roo
e9d0: 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20  t-pages.  ** to 
e9e0: 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  be destroyed is 
e9f0: 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  relocated by an 
ea00: 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72  earlier OP_Destr
ea10: 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a  oy. i.e. if the.
ea20: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
ea30: 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a  ere coded:.  **.
ea40: 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
ea50: 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a  4 0.  ** ....  *
ea60: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30  * OP_Destroy 5 0
ea70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72  .  **.  ** and r
ea80: 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65  oot page 5 happe
ea90: 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  ned to be the la
eaa0: 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
eab0: 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
eac0: 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
ead0: 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f  n root page 5 wo
eae0: 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20  uld be moved to 
eaf0: 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20  page 4 by the . 
eb00: 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20   ** "OP_Destroy 
eb10: 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65  4 0" opcode. The
eb20: 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f   subsequent "OP_
eb30: 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75  Destroy 5 0" wou
eb40: 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72  ld hit.  ** a fr
eb50: 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20  ee-list page..  
eb60: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
eb70: 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e  pTab->tnum;.  in
eb80: 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30  t iDestroyed = 0
eb90: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
eba0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
ebb0: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65  ;.    int iLarge
ebc0: 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  st = 0;..    if(
ebd0: 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c   iDestroyed==0 |
ebe0: 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65  | iTab<iDestroye
ebf0: 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67  d ){.      iLarg
ec00: 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  est = iTab;.    
ec10: 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  }.    for(pIdx=p
ec20: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
ec30: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
ec40: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
ec50: 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75  iIdx = pIdx->tnu
ec60: 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
ec70: 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
ec80: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
ec90: 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73  .      if( (iDes
eca0: 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49  troyed==0 || (iI
ecb0: 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20  dx<iDestroyed)) 
ecc0: 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74  && iIdx>iLargest
ecd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72   ){.        iLar
ece0: 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20  gest = iIdx;.   
ecf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
ed00: 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29  f( iLargest==0 )
ed10: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
ed20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ed30: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
ed40: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
ed50: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
ed60: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
ed70: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
ed80: 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
ed90: 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  st, iDb);.      
eda0: 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61  iDestroyed = iLa
edb0: 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  rgest;.    }.  }
edc0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
edd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
ede0: 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
edf0: 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
ee00: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
ee10: 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
ee20: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
ee30: 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
ee40: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
ee50: 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  e3DropTable(Pars
ee60: 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
ee70: 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
ee80: 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72  sView, int noErr
ee90: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
eea0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
eeb0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
eec0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
eed0: 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Db;..  if( pPars
eee0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
eef0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
ef00: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
ef10: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61  p_table;.  }.  a
ef20: 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
ef30: 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20  rc==1 );.  pTab 
ef40: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
ef50: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61  able(pParse, pNa
ef60: 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
ef70: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
ef80: 61 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70  abase);..  if( p
ef90: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Tab==0 ){.    if
efa0: 28 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20  ( noErr ){.     
efb0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65   sqlite3ErrorCle
efc0: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
efd0: 7d 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  }.    goto exit_
efe0: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
eff0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
f000: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
f010: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
f020: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
f030: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
f040: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61   );..  /* If pTa
f050: 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  b is a virtual t
f060: 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47  able, call ViewG
f070: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20  etColumnNames() 
f080: 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69  to ensure.  ** i
f090: 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  t is initialized
f0a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
f0b0: 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
f0c0: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
f0d0: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
f0e0: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67  , pTab) ){.    g
f0f0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
f100: 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  ble;.  }.#ifndef
f110: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f120: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
f130: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
f140: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
f150: 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
f160: 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74  (iDb);.    const
f170: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
f180: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
f190: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f1a0: 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20  *zArg2 = 0;.    
f1b0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
f1c0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
f1d0: 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
f1e0: 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20  , 0, zDb)){.    
f1f0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
f200: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
f210: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
f220: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
f230: 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
f240: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
f250: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
f260: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
f270: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
f280: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
f290: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  P_VIEW;.      }.
f2a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f2b0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
f2c0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49  .    }else if( I
f2d0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
f2e0: 7b 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53  {.      code = S
f2f0: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c  QLITE_DROP_VTABL
f300: 45 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d  E;.      zArg2 =
f310: 20 70 54 61 62 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61   pTab->pMod->zNa
f320: 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  me;.#endif.    }
f330: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
f340: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
f350: 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
f360: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
f370: 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  DROP_TEMP_TABLE;
f380: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f390: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
f3a0: 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a  ITE_DROP_TABLE;.
f3b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f3c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
f3d0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
f3e0: 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ode, pTab->zName
f3f0: 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b  , zArg2, zDb) ){
f400: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
f410: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
f420: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
f430: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
f440: 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
f450: 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  E, pTab->zName, 
f460: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
f470: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
f480: 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  table;.    }.  }
f490: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54  .#endif.  if( pT
f4a0: 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20  ab->readOnly || 
f4b0: 70 54 61 62 3d 3d 64 62 2d 3e 61 44 62 5b 69 44  pTab==db->aDb[iD
f4c0: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  b].pSchema->pSeq
f4d0: 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
f4e0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
f4f0: 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
f500: 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
f510: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
f520: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
f530: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23  op_table;.  }..#
f540: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f550: 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73  IT_VIEW.  /* Ens
f560: 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69  ure DROP TABLE i
f570: 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20  s not used on a 
f580: 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56  view, and DROP V
f590: 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a  IEW is not used.
f5a0: 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e    ** on a table.
f5b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69  .  */.  if( isVi
f5c0: 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
f5d0: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
f5e0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f5f0: 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
f600: 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
f610: 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d  table %s", pTab-
f620: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
f630: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
f640: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  e;.  }.  if( !is
f650: 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
f660: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
f670: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f680: 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56  rse, "use DROP V
f690: 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69  IEW to delete vi
f6a0: 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  ew %s", pTab->zN
f6b0: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
f6c0: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
f6d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
f6e0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
f6f0: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62  o remove the tab
f700: 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  le from the mast
f710: 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e  er table.  ** on
f720: 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20   disk..  */.  v 
f730: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
f740: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
f750: 76 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72  v ){.    Trigger
f760: 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20   *pTrigger;.    
f770: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
f780: 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c  Db[iDb];.    sql
f790: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
f7a0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
f7b0: 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  0, iDb);..#ifnde
f7c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
f7d0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
f7e0: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
f7f0: 62 29 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65  b) ){.      Vdbe
f800: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
f810: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
f820: 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20      if( v ){.   
f830: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f840: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 42 65 67  AddOp(v, OP_VBeg
f850: 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  in, 0, 0);.     
f860: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
f870: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
f880: 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
f890: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
f8a0: 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
f8b0: 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69  d. Code.    ** i
f8c0: 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72  s generated to r
f8d0: 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72  emove entries fr
f8e0: 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  om sqlite_master
f8f0: 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73   and/or.    ** s
f900: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
f910: 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20  r if required.. 
f920: 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67     */.    pTrigg
f930: 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67  er = pTab->pTrig
f940: 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ger;.    while( 
f950: 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
f960: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
f970: 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  er->pSchema==pTa
f980: 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20  b->pSchema || . 
f990: 20 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65           pTrigge
f9a0: 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  r->pSchema==db->
f9b0: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
f9c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
f9d0: 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50  ropTriggerPtr(pP
f9e0: 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b  arse, pTrigger);
f9f0: 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20  .      pTrigger 
fa00: 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
fa10: 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  t;.    }..#ifnde
fa20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
fa30: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
fa40: 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e  /* Remove any en
fa50: 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c  tries of the sql
fa60: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
fa70: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
fa80: 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61  th.    ** the ta
fa90: 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
faa0: 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  d. This is done 
fab0: 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65  before the table
fac0: 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20   is dropped.    
fad0: 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20  ** at the btree 
fae0: 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74  level, in case t
faf0: 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
fb00: 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74  ce table needs t
fb10: 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73  o.    ** move as
fb20: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
fb30: 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65   drop (can happe
fb40: 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  n in auto-vacuum
fb50: 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20   mode)..    */. 
fb60: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 75 74     if( pTab->aut
fb70: 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 73 71  oInc ){.      sq
fb80: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
fb90: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
fba0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73   "DELETE FROM %s
fbb0: 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
fbc0: 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
fbd0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
fbe0: 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
fbf0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
fc00: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
fc10: 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d  rop all SQLITE_M
fc20: 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20  ASTER table and 
fc30: 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68  index entries th
fc40: 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a  at refer to the.
fc50: 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68      ** table. Th
fc60: 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c  e program name l
fc70: 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  oops through the
fc80: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
fc90: 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a  d deletes.    **
fca0: 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20   every row that 
fcb0: 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
fcc0: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
fcd0: 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65  me as the one be
fce0: 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70  ing.    ** dropp
fcf0: 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65  ed. Triggers are
fd00: 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74   handled seperat
fd10: 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72  ely because a tr
fd20: 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20  igger can be.   
fd30: 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74   ** created in t
fd40: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
fd50: 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
fd60: 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68  a table in anoth
fd70: 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  er.    ** databa
fd80: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  se..    */.    s
fd90: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
fda0: 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
fdb0: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
fdc0: 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f  %Q.%s WHERE tbl_
fdd0: 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65  name=%Q and type
fde0: 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20  !='trigger'",.  
fdf0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
fe00: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
fe10: 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Db), pTab->zName
fe20: 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69  );.    if( !isVi
fe30: 65 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  ew && !IsVirtual
fe40: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
fe50: 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61  destroyTable(pPa
fe60: 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  rse, pTab);.    
fe70: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  }..    /* Remove
fe80: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
fe90: 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69   from SQLite's i
fea0: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61  nternal schema a
feb0: 6e 64 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a  nd modify.    **
fec0: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
fed0: 69 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ie..    */.    i
fee0: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
fef0: 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  b) ){.      sqli
ff00: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
ff10: 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20  _VDestroy, iDb, 
ff20: 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  0, pTab->zName, 
ff30: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
ff40: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
ff50: 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44  OP_DropTable, iD
ff60: 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  b, 0, pTab->zNam
ff70: 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
ff80: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
ff90: 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  b, v, iDb);.  }.
ffa0: 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
ffb0: 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a  tAll(db, iDb);..
ffc0: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a  exit_drop_table:
ffd0: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
ffe0: 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a  tDelete(pName);.
fff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
10000 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
10010 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
10020 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74  foreign key on t
10030 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72  he table.** curr
10040 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
10050 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d  truction.  pFrom
10060 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77  Col determines w
10070 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  hich columns.** 
10080 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
10090 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  able point to th
100a0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  e foreign key.  
100b0 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74  If pFromCol==0 t
100c0 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74  hen.** connect t
100d0 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61  he key to the la
100e0 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74  st column insert
100f0 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20  ed.  pTo is the 
10100 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  name of.** the t
10110 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f  able referred to
10120 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c  .  pToCol is a l
10130 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ist of tables in
10140 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54   the other.** pT
10150 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65  o table that the
10160 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69   foreign key poi
10170 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63  nts to.  flags c
10180 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69  ontains all.** i
10190 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
101a0 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65   the conflict re
101b0 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
101c0 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  hms specified.**
101d0 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54   in the ON DELET
101e0 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64  E, ON UPDATE and
101f0 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73   ON INSERT claus
10200 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65  es..**.** An FKe
10210 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  y structure is c
10220 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64  reated and added
10230 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
10240 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72  rrently.** under
10250 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e   construction in
10260 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   the pParse->pNe
10270 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54  wTable field.  T
10280 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69  he new FKey.** i
10290 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74  s not linked int
102a0 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74  o db->aFKey at t
102b0 68 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74  his point - that
102c0 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e   does not happen
102d0 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65  .** until sqlite
102e0 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a  3EndTable()..**.
102f0 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b  ** The foreign k
10300 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d  ey is set for IM
10310 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69  MEDIATE processi
10320 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e  ng.  A subsequen
10330 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c  t call.** to sql
10340 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
10350 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e  Key() might chan
10360 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52  ge this to DEFER
10370 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  RED..*/.void sql
10380 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67  ite3CreateForeig
10390 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  nKey(.  Parse *p
103a0 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
103b0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
103c0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
103d0 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c  FromCol,  /* Col
103e0 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62  umns in this tab
103f0 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  le that point to
10400 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
10410 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20    Token *pTo,   
10420 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
10430 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  f the other tabl
10440 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
10450 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43  *pToCol,    /* C
10460 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74  olumns in the ot
10470 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  her table */.  i
10480 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
10490 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20      /* Conflict 
104a0 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
104b0 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66  ithms. */.){.#if
104c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
104d0 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46  _FOREIGN_KEY.  F
104e0 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a  Key *pFKey = 0;.
104f0 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61    Table *p = pPa
10500 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
10510 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
10520 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  nt i;.  int nCol
10530 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20  ;.  char *z;..  
10540 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29  assert( pTo!=0 )
10550 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
10560 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
10570 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
10580 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
10590 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
105a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   ){.    int iCol
105b0 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
105c0 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 67    if( iCol<0 ) g
105d0 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
105e0 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
105f0 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29  oCol->nExpr!=1 )
10600 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
10610 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10620 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20  "foreign key on 
10630 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73  %s".         " s
10640 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20  hould reference 
10650 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20  only one column 
10660 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20  of table %T",.  
10670 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69         p->aCol[i
10680 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29  Col].zName, pTo)
10690 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ;.      goto fk_
106a0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  end;.    }.    n
106b0 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Col = 1;.  }else
106c0 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
106d0 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46  ToCol->nExpr!=pF
106e0 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b  romCol->nExpr ){
106f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
10700 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
10710 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20       "number of 
10720 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69  columns in forei
10730 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  gn key does not 
10740 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
10750 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63   of ".        "c
10760 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
10770 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29  ferenced table")
10780 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
10790 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
107a0 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d  nCol = pFromCol-
107b0 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42  >nExpr;.  }.  nB
107c0 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46  yte = sizeof(*pF
107d0 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65  Key) + nCol*size
107e0 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30  of(pFKey->aCol[0
107f0 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b  ]) + pTo->n + 1;
10800 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
10810 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10820 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69  pToCol->nExpr; i
10830 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  ++){.      nByte
10840 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f   += strlen(pToCo
10850 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b  l->a[i].zName) +
10860 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
10870 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44  pFKey = sqlite3D
10880 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
10890 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65 20 29 3b  se->db, nByte );
108a0 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20  .  if( pFKey==0 
108b0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  ){.    goto fk_e
108c0 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d  nd;.  }.  pFKey-
108d0 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46  >pFrom = p;.  pF
108e0 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d  Key->pNextFrom =
108f0 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d   p->pFKey;.  z =
10900 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31   (char*)&pFKey[1
10910 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  ];.  pFKey->aCol
10920 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d   = (struct sColM
10930 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69  ap*)z;.  z += si
10940 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c  zeof(struct sCol
10950 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b  Map)*nCol;.  pFK
10960 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
10970 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
10980 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
10990 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b  o->n] = 0;.  z +
109a0 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
109b0 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30  Key->pNextTo = 0
109c0 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
109d0 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46  = nCol;.  if( pF
109e0 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
109f0 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e   pFKey->aCol[0].
10a00 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  iFrom = p->nCol-
10a10 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
10a20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
10a30 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
10a40 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
10a50 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b  0; j<p->nCol; j+
10a60 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
10a70 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
10a80 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
10a90 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
10aa0 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
10ab0 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
10ac0 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
10ad0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
10ae0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10af0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
10b00 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
10b10 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10b20 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
10b30 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20         "unknown 
10b40 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e  column \"%s\" in
10b50 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
10b60 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20  inition", .     
10b70 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61       pFromCol->a
10b80 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
10b90 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
10ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10bb0 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
10bc0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
10bd0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
10be0 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
10bf0 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
10c00 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
10c10 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
10c20 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
10c30 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
10c40 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
10c50 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
10c60 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
10c70 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
10c80 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
10c90 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74  ;.  pFKey->delet
10ca0 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20  eConf = flags & 
10cb0 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75  0xff;.  pFKey->u
10cc0 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61  pdateConf = (fla
10cd0 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
10ce0 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72  ;.  pFKey->inser
10cf0 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  tConf = (flags >
10d00 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a  > 16 ) & 0xff;..
10d10 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
10d20 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
10d30 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
10d40 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
10d50 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
10d60 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
10d70 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
10d80 33 5f 66 72 65 65 28 70 46 4b 65 79 29 3b 0a 23  3_free(pFKey);.#
10d90 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
10da0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  d(SQLITE_OMIT_FO
10db0 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20  REIGN_KEY) */.  
10dc0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
10dd0 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b  elete(pFromCol);
10de0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
10df0 73 74 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29  stDelete(pToCol)
10e00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
10e10 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
10e20 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41  d when an INITIA
10e30 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72  LLY IMMEDIATE or
10e40 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
10e50 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73  RED.** clause is
10e60 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66   seen as part of
10e70 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64   a foreign key d
10e80 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20  efinition.  The 
10e90 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61  isDeferred.** pa
10ea0 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72  rameter is 1 for
10eb0 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
10ec0 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e  RED and 0 for IN
10ed0 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
10ee0 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69  E..** The behavi
10ef0 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  or of the most r
10f00 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
10f10 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61  foreign key is a
10f20 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72  djusted.** accor
10f30 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  dingly..*/.void 
10f40 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
10f50 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50  ignKey(Parse *pP
10f60 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65  arse, int isDefe
10f70 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53  rred){.#ifndef S
10f80 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
10f90 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a  GN_KEY.  Table *
10fa0 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46  pTab;.  FKey *pF
10fb0 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62  Key;.  if( (pTab
10fc0 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
10fd0 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b  able)==0 || (pFK
10fe0 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79  ey = pTab->pFKey
10ff0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
11000 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
11010 65 64 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b  ed = isDeferred;
11020 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
11030 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
11040 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61  hat will erase a
11050 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20  nd refill index 
11060 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a  *pIdx.  This is.
11070 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69  ** used to initi
11080 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72  alize a newly cr
11090 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74  eated index or t
110a0 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a  o recompute the.
110b0 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  ** content of an
110c0 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e   index in respon
110d0 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20  se to a REINDEX 
110e0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69  command..**.** i
110f0 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
11100 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69   not negative, i
11110 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
11120 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a   index is newly.
11130 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  ** created.  The
11140 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 73 70 65   memory cell spe
11150 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f  cified by memRoo
11160 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74  tPage contains t
11170 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
11180 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
11190 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74  dex.  If memRoot
111a0 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
111b0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e  , then.** the in
111c0 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
111d0 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63  ts and must be c
111e0 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65  leared before be
111f0 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64  ing refilled and
11200 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
11210 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
11220 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66  index is taken f
11230 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  rom pIndex->tnum
11240 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11250 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
11260 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
11270 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  e, Index *pIndex
11280 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67  , int memRootPag
11290 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  e){.  Table *pTa
112a0 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
112b0 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  le;  /* The tabl
112c0 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65  e that is indexe
112d0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20  d */.  int iTab 
112e0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 20  = pParse->nTab; 
112f0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63        /* Btree c
11300 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
11310 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  Tab */.  int iId
11320 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
11330 2b 31 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  +1;     /* Btree
11340 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
11350 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74   pIndex */.  int
11360 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20   addr1;         
11370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11380 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66  ddress of top of
11390 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74   loop */.  int t
113a0 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
113b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
113c0 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20  t page of index 
113d0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113f0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
11400 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76  code into this v
11410 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a  irtual machine *
11420 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
11430 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
11440 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f     /* KeyInfo fo
11450 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c  r index */.  sql
11460 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
11470 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54  e->db;      /* T
11480 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
11490 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
114a0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
114b0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
114c0 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
114d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
114e0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
114f0 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ION.  if( sqlite
11500 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
11510 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e, SQLITE_REINDE
11520 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  X, pIndex->zName
11530 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61  , 0,.      db->a
11540 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20  Db[iDb].zName ) 
11550 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
11560 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
11570 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Require a write-
11580 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
11590 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69  e to perform thi
115a0 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  s operation */. 
115b0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
115c0 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
115d0 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54  Tab->tnum, 1, pT
115e0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76  ab->zName);..  v
115f0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
11600 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
11610 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
11620 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
11630 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  e>=0 ){.    sqli
11640 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11650 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52  OP_MemLoad, memR
11660 6f 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  ootPage, 0);.   
11670 20 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c   tnum = 0;.  }el
11680 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70  se{.    tnum = p
11690 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20  Index->tnum;.   
116a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
116b0 70 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74  p(v, OP_Clear, t
116c0 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20  num, iDb);.  }. 
116d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
116e0 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
116f0 20 69 44 62 2c 20 30 29 3b 0a 20 20 70 4b 65 79   iDb, 0);.  pKey
11700 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
11710 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
11720 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65  Index);.  sqlite
11730 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f  3VdbeOp3(v, OP_O
11740 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20  penWrite, iIdx, 
11750 74 6e 75 6d 2c 20 28 63 68 61 72 20 2a 29 70 4b  tnum, (char *)pK
11760 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P3_KEYINFO_H
11770 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74  ANDOFF);.  sqlit
11780 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
11790 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
117a0 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
117b0 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
117c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
117d0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
117e0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  , 0);.  sqlite3G
117f0 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
11800 76 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62 29  v, pIndex, iTab)
11810 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  ;.  if( pIndex->
11820 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
11830 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 75 72 61   ){.    int cura
11840 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
11850 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
11860 0a 20 20 20 20 69 6e 74 20 61 64 64 72 32 20 3d  .    int addr2 =
11870 20 63 75 72 61 64 64 72 2b 34 3b 0a 20 20 20 20   curaddr+4;.    
11880 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
11890 65 50 32 28 76 2c 20 63 75 72 61 64 64 72 2d 31  eP2(v, curaddr-1
118a0 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73 71  , addr2);.    sq
118b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
118c0 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62  , OP_Rowid, iTab
118d0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
118e0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
118f0 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29 3b 0a  _AddImm, 1, 0);.
11900 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11910 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 55 6e 69  ddOp(v, OP_IsUni
11920 71 75 65 2c 20 69 49 64 78 2c 20 61 64 64 72 32  que, iIdx, addr2
11930 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11940 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74  beOp3(v, OP_Halt
11950 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
11960 49 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c 0a 20  INT, OE_Abort,. 
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75     "indexed colu
11990 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71  mns are not uniq
119a0 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ue", P3_STATIC);
119b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
119c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
119d0 20 61 64 64 72 32 3d 3d 73 71 6c 69 74 65 33 56   addr2==sqlite3V
119e0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
119f0 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ) );.  }.  sqlit
11a00 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11a10 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64  P_IdxInsert, iId
11a20 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  x, 0);.  sqlite3
11a30 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11a40 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
11a50 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  1+1);.  sqlite3V
11a60 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
11a70 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddr1);.  sqlite3
11a80 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11a90 43 6c 6f 73 65 2c 20 69 54 61 62 2c 20 30 29 3b  Close, iTab, 0);
11aa0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
11ab0 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
11ac0 20 69 49 64 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a   iIdx, 0);.}../*
11ad0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
11ae0 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51   index for an SQ
11af0 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31  L table.  pName1
11b00 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e  .pName2 is the n
11b10 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
11b20 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73   .** and pTblLis
11b30 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
11b40 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
11b50 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
11b60 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a  .  Both will .**
11b70 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70   be NULL for a p
11b80 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e  rimary key or an
11b90 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63   index that is c
11ba0 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66  reated to satisf
11bb0 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f  y a.** UNIQUE co
11bc0 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54  nstraint.  If pT
11bd0 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20  able and pIndex 
11be0 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50  are NULL, use pP
11bf0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a  arse->pNewTable.
11c00 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20  ** as the table 
11c10 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
11c20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
11c30 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61  e is a table tha
11c40 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  t is.** currentl
11c50 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
11c60 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20  ted by a CREATE 
11c70 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
11c80 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20  .**.** pList is 
11c90 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  a list of column
11ca0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
11cb0 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20    pList will be 
11cc0 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20  NULL if this.** 
11cd0 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  is a primary key
11ce0 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74   or unique-const
11cf0 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73  raint on the mos
11d00 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20  t recent column 
11d10 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  added.** to the 
11d20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
11d30 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
11d40 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  on.  .*/.void sq
11d50 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
11d60 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11d70 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e  e,     /* All in
11d80 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
11d90 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20  this parse */.  
11da0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
11db0 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
11dc0 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
11dd0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
11de0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
11df0 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61      /* Second pa
11e00 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
11e10 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
11e20 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c  .  SrcList *pTbl
11e30 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74  Name, /* Table t
11e40 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61  o index. Use pPa
11e50 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
11e60 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  f 0 */.  ExprLis
11e70 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41  t *pList,   /* A
11e80 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
11e90 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
11ea0 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
11eb0 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f         /* OE_Abo
11ec0 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f  rt, OE_Ignore, O
11ed0 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45  E_Replace, or OE
11ee0 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  _None */.  Token
11ef0 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *pStart,     /*
11f00 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
11f10 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
11f20 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  is statement */.
11f30 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
11f40 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20       /* The ")" 
11f50 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20  that closes the 
11f60 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
11f70 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
11f80 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f  sortOrder,     /
11f90 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20  * Sort order of 
11fa0 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e  primary key when
11fb0 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a   pList==NULL */.
11fc0 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74    int ifNotExist
11fd0 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72       /* Omit err
11fe0 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65  or if index alre
11ff0 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
12000 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
12010 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65   0;     /* Table
12020 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
12030 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
12040 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  x = 0;   /* The 
12050 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
12060 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
12070 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Name = 0;     /*
12080 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   Name of the ind
12090 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ex */.  int nNam
120a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
120b0 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
120c0 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f  ters in zName */
120d0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54  .  int i, j;.  T
120e0 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20  oken nullId;    
120f0 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65      /* Fake toke
12100 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49  n for an empty I
12110 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46 69  D list */.  DbFi
12120 78 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20  xer sFix;       
12130 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e   /* For assignin
12140 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73  g database names
12150 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20   to pTable */.  
12160 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  int sortOrderMas
12170 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e  k;   /* 1 to hon
12180 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78  or DESC in index
12190 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20  .  0 to ignore. 
121a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
121b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
121c0 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
121d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65        /* The spe
121e0 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74  cific table cont
121f0 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  aining the index
12200 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ed database */. 
12210 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
12220 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
12230 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
12240 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69  hat is being wri
12250 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tten */.  Token 
12260 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f  *pName = 0;    /
12270 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
12280 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
12290 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73  to create */.  s
122a0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
122b0 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20  tem *pListItem; 
122c0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
122d0 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69  ver pList */.  i
122e0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e  nt nCol;.  int n
122f0 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 63 68 61  Extra = 0;.  cha
12300 72 20 2a 7a 45 78 74 72 61 3b 0a 0a 20 20 69 66  r *zExtra;..  if
12310 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
12320 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
12330 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  ed || IN_DECLARE
12340 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 67 6f 74  _VTAB ){.    got
12350 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12360 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  dex;.  }..  /*. 
12370 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
12380 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
12390 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
123a0 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
123b0 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
123c0 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
123d0 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
123e0 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e  two-part index n
123f0 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
12400 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
12410 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20     ** to search 
12420 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27  for the table. '
12430 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e  Fix' the table n
12440 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20  ame to this db. 
12450 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f     ** before loo
12460 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c  king up the tabl
12470 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
12480 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20  sert( pName1 && 
12490 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44  pName2 );.    iD
124a0 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
124b0 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
124c0 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
124d0 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
124e0 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69  iDb<0 ) goto exi
124f0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12500 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12510 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20  OMIT_TEMPDB.    
12520 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  /* If the index 
12530 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69  name was unquali
12540 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74  fied, check if t
12550 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  he the table.   
12560 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61   ** is a temp ta
12570 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20  ble. If so, set 
12580 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
12590 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54  1..    */.    pT
125a0 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  ab = sqlite3SrcL
125b0 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  istLookup(pParse
125c0 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20  , pTblName);.   
125d0 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70   if( pName2 && p
125e0 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
125f0 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63  Tab && pTab->pSc
12600 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
12610 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
12620 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d    iDb = 1;.    }
12630 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28  .#endif..    if(
12640 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
12650 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
12660 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61  Db, "index", pNa
12670 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73  me) &&.        s
12680 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
12690 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65  (&sFix, pTblName
126a0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
126b0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61  * Because the pa
126c0 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20  rser constructs 
126d0 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20  pTblName from a 
126e0 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65  single identifie
126f0 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  r,.      ** sqli
12700 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61  te3FixSrcList ca
12710 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f  n never fail. */
12720 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
12730 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
12740 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
12750 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
12760 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61  blName->a[0].zNa
12770 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62  me, .        pTb
12780 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  lName->a[0].zDat
12790 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20  abase);.    if( 
127a0 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
127b0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
127c0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
127d0 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
127e0 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
127f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12800 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30  assert( pName==0
12810 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70   );.    pTab = p
12820 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
12830 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20  ;.    if( !pTab 
12840 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
12850 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44  te_index;.    iD
12860 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
12870 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
12880 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  b->pSchema);.  }
12890 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
128a0 62 5b 69 44 62 5d 3b 0a 0a 20 20 69 66 28 20 70  b[iDb];..  if( p
128b0 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  Tab==0 || pParse
128c0 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78  ->nErr ) 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 69 66 28 20 70 54 61 62 2d 3e 72 65 61  .  if( pTab->rea
128f0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c  dOnly ){.    sql
12900 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
12910 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
12920 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
12930 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
12940 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
12950 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
12960 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
12970 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28  _OMIT_VIEW.  if(
12980 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
12990 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
129a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
129b0 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
129c0 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
129d0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
129e0 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
129f0 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
12a00 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
12a10 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
12a20 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
12a30 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12a40 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c  pParse, "virtual
12a50 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20   tables may not 
12a60 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
12a70 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
12a80 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
12a90 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
12aa0 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
12ab0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
12ac0 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
12ad0 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
12ae0 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
12af0 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
12b00 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
12b10 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
12b20 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
12b30 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
12b40 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
12b50 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
12b60 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
12b70 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
12b80 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
12b90 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
12ba0 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
12bb0 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
12bc0 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
12bd0 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
12be0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
12bf0 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
12c00 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
12c10 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
12c20 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
12c30 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
12c40 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
12c50 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
12c60 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
12c70 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
12c80 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
12c90 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
12ca0 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
12cb0 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
12cc0 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
12cd0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
12ce0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
12cf0 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 53  Name);.    if( S
12d00 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
12d10 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
12d20 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  se) ) goto exit_
12d30 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
12d40 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
12d50 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12d60 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
12d70 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
12d80 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
12d90 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
12da0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
12db0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12dc0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
12dd0 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
12de0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ){.      if( SQL
12df0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
12e00 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
12e10 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  ) ) goto exit_cr
12e20 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
12e30 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
12e40 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
12e50 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)!=0 ){.     
12e60 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12e70 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
12e80 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
12e90 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20  able named %s", 
12ea0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
12eb0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12ec0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
12ed0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
12ee0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
12ef0 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a  b, zName, pDb->z
12f00 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
12f10 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73    if( !ifNotExis
12f20 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
12f30 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
12f40 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61  rse, "index %s a
12f50 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
12f60 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
12f70 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
12f80 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
12f90 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
12fa0 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
12fb0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49      int n;.    I
12fc0 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  ndex *pLoop;.   
12fd0 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d   for(pLoop=pTab-
12fe0 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c  >pIndex, n=1; pL
12ff0 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
13000 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a  ->pNext, n++){}.
13010 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
13020 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
13030 29 2c 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b  ),zBuf,"_%d",n);
13040 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a  .    zName = 0;.
13050 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
13060 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71  ring(&zName, "sq
13070 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22  lite_autoindex_"
13080 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
13090 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Buf, (char*)0);.
130a0 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
130b0 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61   ){.      db->ma
130c0 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
130d0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
130e0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
130f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
13100 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a  eck for authoriz
13110 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ation to create 
13120 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23  an index..  */.#
13130 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13140 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
13150 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  .  {.    const c
13160 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e  har *zDb = pDb->
13170 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
13180 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
13190 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
131a0 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
131b0 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62  BLE(iDb), 0, zDb
131c0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
131d0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
131e0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  x;.    }.    i =
131f0 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49   SQLITE_CREATE_I
13200 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f  NDEX;.    if( !O
13210 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
13220 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54  b==1 ) i = SQLIT
13230 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
13240 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
13250 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
13260 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  arse, i, zName, 
13270 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
13280 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
13290 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
132a0 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
132b0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69  dif..  /* If pLi
132c0 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20  st==0, it means 
132d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
132e0 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20   called to make 
132f0 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  a primary.  ** k
13300 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61  ey out of the la
13310 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
13320 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  to the table und
13330 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
13340 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20  .  ** So create 
13350 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73  a fake list to s
13360 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20  imulate this..  
13370 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
13380 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  0 ){.    nullId.
13390 7a 20 3d 20 28 75 38 2a 29 70 54 61 62 2d 3e 61  z = (u8*)pTab->a
133a0 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31  Col[pTab->nCol-1
133b0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c  ].zName;.    nul
133c0 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 28  lId.n = strlen((
133d0 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b  char*)nullId.z);
133e0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
133f0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
13400 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  nd(pParse, 0, 0,
13410 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69   &nullId);.    i
13420 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f  f( pList==0 ) go
13430 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13440 6e 64 65 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d  ndex;.    pList-
13450 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
13460 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  = sortOrder;.  }
13470 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
13480 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73  t how many bytes
13490 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65   of space are re
134a0 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
134b0 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20  explicitly.  ** 
134c0 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74  specified collat
134d0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
134e0 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
134f0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
13500 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
13510 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
13520 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
13530 20 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a     if( pExpr ){.
13540 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20        nExtra += 
13550 28 31 20 2b 20 73 74 72 6c 65 6e 28 70 45 78 70  (1 + strlen(pExp
13560 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  r->pColl->zName)
13570 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
13580 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74  /* .  ** Allocat
13590 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
135a0 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e  cture. .  */.  n
135b0 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
135c0 61 6d 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70  ame);.  nCol = p
135d0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
135e0 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44  Index = sqlite3D
135f0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
13600 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 49 6e  .      sizeof(In
13610 64 65 78 29 20 2b 20 20 20 20 20 20 20 20 20 20  dex) +          
13620 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72      /* Index str
13630 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20  ucture  */.     
13640 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f   sizeof(int)*nCo
13650 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l +           /*
13660 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20   Index.aiColumn 
13670 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f    */.      sizeo
13680 66 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20  f(int)*(nCol+1) 
13690 2b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  +       /* Index
136a0 2e 61 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20  .aiRowEst   */. 
136b0 20 20 20 20 20 73 69 7a 65 6f 66 28 63 68 61 72       sizeof(char
136c0 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20   *)*nCol +      
136d0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c    /* Index.azCol
136e0 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73  l     */.      s
136f0 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 20 2b  izeof(u8)*nCol +
13700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13710 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20  ndex.aSortOrder 
13720 2a 2f 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b  */.      nName +
13730 20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20   1 +            
13740 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 7a        /* Index.z
13750 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0a 20 20 20  Name      */.   
13760 20 20 20 6e 45 78 74 72 61 20 20 20 20 20 20 20     nExtra       
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13780 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  /* Collation seq
13790 75 65 6e 63 65 20 6e 61 6d 65 73 20 2a 2f 0a 20  uence names */. 
137a0 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   );.  if( db->ma
137b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
137c0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
137d0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
137e0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d  pIndex->azColl =
137f0 20 28 63 68 61 72 2a 2a 29 28 26 70 49 6e 64 65   (char**)(&pInde
13800 78 5b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  x[1]);.  pIndex-
13810 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74  >aiColumn = (int
13820 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43   *)(&pIndex->azC
13830 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49  oll[nCol]);.  pI
13840 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d  ndex->aiRowEst =
13850 20 28 75 6e 73 69 67 6e 65 64 20 2a 29 28 26 70   (unsigned *)(&p
13860 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
13870 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78  nCol]);.  pIndex
13880 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
13890 75 38 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61  u8 *)(&pIndex->a
138a0 69 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29  iRowEst[nCol+1])
138b0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ;.  pIndex->zNam
138c0 65 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49  e = (char *)(&pI
138d0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
138e0 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72  [nCol]);.  zExtr
138f0 61 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49  a = (char *)(&pI
13900 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d  ndex->zName[nNam
13910 65 2b 31 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  e+1]);.  memcpy(
13920 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
13930 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a  Name, nName+1);.
13940 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
13950 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65   = pTab;.  pInde
13960 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69  x->nColumn = pLi
13970 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
13980 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f  dex->onError = o
13990 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78  nError;.  pIndex
139a0 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e  ->autoIndex = pN
139b0 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78  ame==0;.  pIndex
139c0 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
139d0 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
139e0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
139f0 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c   see if we shoul
13a00 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71  d honor DESC req
13a10 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63  uests on index c
13a20 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66  olumns.  */.  if
13a30 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
13a40 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
13a50 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
13a60 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48  ask = -1;   /* H
13a70 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d  onor DESC */.  }
13a80 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72  else{.    sortOr
13a90 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  derMask = 0;    
13aa0 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a  /* Ignore DESC *
13ab0 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e  /.  }..  /* Scan
13ac0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
13ad0 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
13ae0 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
13af0 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  exed and.  ** lo
13b00 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  ad the column in
13b10 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49  dices into the I
13b20 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
13b30 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
13b40 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c  .  ** if any col
13b50 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  umn is not found
13b60 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
13b70 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73  , pListItem=pLis
13b80 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  t->a; i<pList->n
13b90 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74  Expr; i++, pList
13ba0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  Item++){.    con
13bb0 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d  st char *zColNam
13bc0 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a  e = pListItem->z
13bd0 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e  Name;.    Column
13be0 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69   *pTabCol;.    i
13bf0 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74  nt requestedSort
13c00 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20  Order;.    char 
13c10 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
13c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
13c30 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
13c40 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72  name */..    for
13c50 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54  (j=0, pTabCol=pT
13c60 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62  ab->aCol; j<pTab
13c70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61  ->nCol; j++, pTa
13c80 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  bCol++){.      i
13c90 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
13ca0 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62  p(zColName, pTab
13cb0 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col->zName)==0 )
13cc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
13cd0 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
13ce0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
13cf0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13d00 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68  rse, "table %s h
13d10 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
13d20 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  ed %s",.        
13d30 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
13d40 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  lName);.      go
13d50 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13d60 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
13d70 2f 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20 61 20  /* TODO:  Add a 
13d80 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72  test to make sur
13d90 65 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  e that the same 
13da0 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61  column is not na
13db0 6d 65 64 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20  med.    ** more 
13dc0 74 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e  than once within
13dd0 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e   the same index.
13de0 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74    Only the first
13df0 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20 20   instance of.   
13e00 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77   ** the column w
13e10 69 6c 6c 20 65 76 65 72 20 62 65 20 75 73 65 64  ill ever be used
13e20 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65   by the optimize
13e30 72 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 75 73  r.  Note that us
13e40 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  ing the.    ** s
13e50 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20  ame column more 
13e60 74 68 61 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f 74  than once cannot
13e70 20 62 65 20 61 6e 20 65 72 72 6f 72 20 62 65 63   be an error bec
13e80 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
13e90 0a 20 20 20 20 2a 2a 20 62 72 65 61 6b 20 62 61  .    ** break ba
13ea0 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
13eb0 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65 64 73  ility - it needs
13ec0 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69 6e 67   to be a warning
13ed0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
13ee0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
13ef0 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c   = j;.    if( pL
13f00 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 29  istItem->pExpr )
13f10 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13f20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
13f30 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20  ->pColl );.     
13f40 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b   zColl = zExtra;
13f50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
13f60 6e 70 72 69 6e 74 66 28 6e 45 78 74 72 61 2c 20  nprintf(nExtra, 
13f70 7a 45 78 74 72 61 2c 20 22 25 73 22 2c 20 70 4c  zExtra, "%s", pL
13f80 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
13f90 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
13fa0 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 28       zExtra += (
13fb0 73 74 72 6c 65 6e 28 7a 43 6f 6c 6c 29 20 2b 20  strlen(zColl) + 
13fc0 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
13fd0 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61       zColl = pTa
13fe0 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c  b->aCol[j].zColl
13ff0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f  ;.      if( !zCo
14000 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  ll ){.        zC
14010 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
14020 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
14030 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
14040 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
14050 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61   && !sqlite3Loca
14060 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
14070 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a  , zColl, -1) ){.
14080 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
14090 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
140a0 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
140b0 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c  azColl[i] = zCol
140c0 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64  l;.    requested
140d0 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73  SortOrder = pLis
140e0 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  tItem->sortOrder
140f0 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b   & sortOrderMask
14100 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53  ;.    pIndex->aS
14110 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 72 65  ortOrder[i] = re
14120 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
14130 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
14140 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e  efaultRowEst(pIn
14150 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61  dex);..  if( pTa
14160 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b==pParse->pNewT
14170 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  able ){.    /* T
14180 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
14190 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63  been called to c
141a0 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74  reate an automat
141b0 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20  ic index as a.  
141c0 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61    ** result of a
141d0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
141e0 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e  UNIQUE clause on
141f0 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69   a column defini
14200 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  tion, or.    ** 
14210 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
14220 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66   UNIQUE clause f
14230 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c  ollowing the col
14240 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e  umn definitions.
14250 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65  .    ** i.e. one
14260 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
14270 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
14280 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  t(x PRIMARY KEY,
14290 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41   y);.    ** CREA
142a0 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c  TE TABLE t(x, y,
142b0 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a   UNIQUE(x, y));.
142c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69      **.    ** Ei
142d0 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20  ther way, check 
142e0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61  to see if the ta
142f0 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20  ble already has 
14300 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49  such an index. I
14310 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e  f.    ** so, don
14320 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69  't bother creati
14330 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69  ng this one. Thi
14340 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74  s only applies t
14350 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74  o.    ** automat
14360 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69  ically created i
14370 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61  ndices. Users ca
14380 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73  n do as they wis
14390 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78  h with.    ** ex
143a0 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a  plicit indices..
143b0 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78      */.    Index
143c0 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
143d0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
143e0 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
143f0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
14400 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61    int k;.      a
14410 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45  ssert( pIdx->onE
14420 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b  rror!=OE_None );
14430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14440 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29  Idx->autoIndex )
14450 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14460 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
14470 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20  =OE_None );..   
14480 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f     if( pIdx->nCo
14490 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43  lumn!=pIndex->nC
144a0 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
144b0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b  ;.      for(k=0;
144c0 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   k<pIdx->nColumn
144d0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
144e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 20 3d  const char *z1 =
144f0 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d   pIdx->azColl[k]
14500 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
14510 63 68 61 72 20 2a 7a 32 20 3d 20 70 49 6e 64 65  char *z2 = pInde
14520 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
14530 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
14540 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e  aiColumn[k]!=pIn
14550 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  dex->aiColumn[k]
14560 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
14570 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53 6f 72    if( pIdx->aSor
14580 74 4f 72 64 65 72 5b 6b 5d 21 3d 70 49 6e 64 65  tOrder[k]!=pInde
14590 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d  x->aSortOrder[k]
145a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
145b0 20 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20    if( z1!=z2 && 
145c0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
145d0 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a  1, z2) ) break;.
145e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
145f0 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  ( k==pIdx->nColu
14600 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  mn ){.        if
14610 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
14620 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  =pIndex->onError
14630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
14640 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   This constraint
14650 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d   creates the sam
14660 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65  e index as a pre
14670 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20  vious.          
14680 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70  ** constraint sp
14690 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72  ecified somewher
146a0 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  e in the CREATE 
146b0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
146c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f  .          ** Ho
146d0 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e  wever the ON CON
146e0 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72  FLICT clauses ar
146f0 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20  e different. If 
14700 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20  both this .     
14710 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
14720 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69  nt and the previ
14730 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63  ous equivalent c
14740 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65  onstraint have e
14750 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20  xplicit.        
14760 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    ** ON CONFLICT
14770 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73   clauses this is
14780 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72   an error. Other
14790 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20  wise, use the.  
147a0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69          ** expli
147b0 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
147c0 62 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68  behaviour for th
147d0 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  e index..       
147e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
147f0 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72  if( !(pIdx->onEr
14800 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
14810 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  || pIndex->onErr
14820 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20  or==OE_Default) 
14830 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
14840 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14850 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
14860 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63          "conflic
14870 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  ting ON CONFLICT
14880 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69   clauses specifi
14890 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ed", 0);.       
148a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
148b0 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
148c0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a  ==OE_Default ){.
148d0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
148e0 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64  ->onError = pInd
148f0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  ex->onError;.   
14900 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14910 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
14920 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
14930 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
14940 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
14950 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
14960 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
14970 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
14980 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65  other.  ** in-me
14990 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
149a0 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a  ructures. .  */.
149b0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
149c0 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  usy ){.    Index
149d0 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
149e0 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
149f0 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
14a00 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  >idxHash, .     
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
14a30 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78  e, strlen(pIndex
14a40 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64  ->zName)+1, pInd
14a50 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  ex);.    if( p )
14a60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14a70 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a  p==pIndex );  /*
14a80 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
14a90 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  e failed */.    
14aa0 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
14ab0 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  ed = 1;.      go
14ac0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
14ad0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
14ae0 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
14af0 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
14b00 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  s;.    if( pTblN
14b10 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
14b20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
14b30 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
14b40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
14b50 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
14b60 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e 20  .busy is 0 then 
14b70 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78  create the index
14b80 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a   on disk.  This.
14b90 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72    ** involves wr
14ba0 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  iting the index 
14bb0 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  into the master 
14bc0 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e  table and fillin
14bd0 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  g in the.  ** in
14be0 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72  dex with the cur
14bf0 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65  rent table conte
14c00 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nts..  **.  ** T
14c10 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
14c20 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75   is 0 when the u
14c30 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73  ser first enters
14c40 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20   a CREATE INDEX 
14c50 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20  .  ** command.  
14c60 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
14c70 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61   1 when a databa
14c80 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64  se is opened and
14c90 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e   .  ** CREATE IN
14ca0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61  DEX statements a
14cb0 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74  re read out of t
14cc0 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  he master table.
14cd0 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61    In.  ** the la
14ce0 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e  tter case the in
14cf0 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
14d00 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63  ts on disk, whic
14d10 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65  h is why.  ** we
14d20 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
14d30 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a  ecreate it..  **
14d40 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d  .  ** If pTblNam
14d50 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
14d60 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
14d70 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61  rated as a prima
14d80 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55  ry key.  ** or U
14d90 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
14da0 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42   of a CREATE TAB
14db0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
14dc0 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
14dd0 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
14de0 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
14df0 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
14e00 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
14e10 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
14e20 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
14e30 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
14e40 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62  e if( db->init.b
14e50 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64  usy==0 ){.    Vd
14e60 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
14e70 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20  *zStmt;.    int 
14e80 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
14e90 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d 20  Mem++;..    v = 
14ea0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
14eb0 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
14ec0 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
14ed0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
14ee0 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
14ef0 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20  he rootpage for 
14f00 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  the index.    */
14f10 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
14f20 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
14f30 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
14f40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14f50 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
14f60 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 29  teIndex, iDb, 0)
14f70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14f80 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
14f90 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b  Store, iMem, 0);
14fa0 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20  ..    /* Gather 
14fb0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
14fc0 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
14fd0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
14fe0 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  into.    ** the 
14ff0 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20  zStmt variable. 
15000 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
15010 74 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a  tart && pEnd ){.
15020 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64        /* A named
15030 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65   index with an e
15040 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49  xplicit CREATE I
15050 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
15060 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
15070 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
15080 62 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44  b, "CREATE%s IND
15090 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20  EX %.*s",.      
150a0 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f    onError==OE_No
150b0 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51  ne ? "" : " UNIQ
150c0 55 45 22 2c 0a 20 20 20 20 20 20 20 20 70 45 6e  UE",.        pEn
150d0 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20  d->z - pName->z 
150e0 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61  + 1,.        pNa
150f0 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  me->z);.    }els
15100 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61  e{.      /* An a
15110 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63  utomatic index c
15120 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d  reated by a PRIM
15130 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
15140 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  E constraint */.
15150 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d        /* zStmt =
15160 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
15170 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ""); */.      zS
15180 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  tmt = 0;.    }..
15190 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e      /* Add an en
151a0 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61  try in sqlite_ma
151b0 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e  ster for this in
151c0 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
151d0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
151e0 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
151f0 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
15200 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e  %Q.%s VALUES('in
15210 64 65 78 27 2c 25 51 2c 25 51 2c 23 30 2c 25 51  dex',%Q,%Q,#0,%Q
15220 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d  );",.        db-
15230 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
15240 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
15250 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64  b),.        pInd
15260 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ex->zName,.     
15270 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
15280 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20          zStmt.  
15290 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
152a0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
152b0 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
152c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 74  sqlite3_free(zSt
152d0 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c  mt);..    /* Fil
152e0 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  l the index with
152f0 20 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73   data and repars
15300 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f  e the schema. Co
15310 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a  de an OP_Expire.
15320 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69      ** to invali
15330 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d  date all pre-com
15340 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
15350 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
15360 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   pTblName ){.   
15370 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
15380 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
15390 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  ndex, iMem);.   
153a0 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
153b0 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44  Cookie(db, v, iD
153c0 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
153d0 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50  3VdbeOp3(v, OP_P
153e0 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c  arseSchema, iDb,
153f0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c   0,.         sql
15400 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
15410 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e  "name='%q'", pIn
15420 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f  dex->zName), P3_
15430 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
15440 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15450 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30  (v, OP_Expire, 0
15460 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
15470 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e  .  /* When addin
15480 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68  g an index to th
15490 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65  e list of indice
154a0 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d  s for a table, m
154b0 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c  ake.  ** sure al
154c0 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65  l indices labele
154d0 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d  d OE_Replace com
154e0 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73  e after all thos
154f0 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f  e labeled.  ** O
15500 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20  E_Ignore.  This 
15510 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
15520 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
15530 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45  ration of UPDATE
15540 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54  .  ** and INSERT
15550 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
15560 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54  >init.busy || pT
15570 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  blName==0 ){.   
15580 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45   if( onError!=OE
15590 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62  _Replace || pTab
155a0 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20  ->pIndex==0.    
155b0 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49       || pTab->pI
155c0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
155d0 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20  E_Replace){.    
155e0 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
155f0 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
15600 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64        pTab->pInd
15610 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  ex = pIndex;.   
15620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
15630 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54  dex *pOther = pT
15640 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
15650 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d    while( pOther-
15660 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72  >pNext && pOther
15670 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72  ->pNext->onError
15680 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  !=OE_Replace ){.
15690 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d          pOther =
156a0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
156b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
156c0 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f  ndex->pNext = pO
156d0 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
156e0 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74     pOther->pNext
156f0 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
15700 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b  .    pIndex = 0;
15710 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
15720 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69   up before exiti
15730 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74  ng */.exit_creat
15740 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70  e_index:.  if( p
15750 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 66 72 65  Index ){.    fre
15760 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
15770 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
15780 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
15790 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63  t);.  sqlite3Src
157a0 4c 69 73 74 44 65 6c 65 74 65 28 70 54 62 6c 4e  ListDelete(pTblN
157b0 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
157c0 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72  free(zName);.  r
157d0 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
157e0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
157f0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 66   make sure the f
15800 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65  ile format numbe
15810 72 20 69 73 20 61 74 20 6c 65 61 73 74 20 6d 69  r is at least mi
15820 6e 46 6f 72 6d 61 74 2e 0a 2a 2a 20 54 68 65 20  nFormat..** The 
15830 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20 77  generated code w
15840 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65  ill increase the
15850 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d   file format num
15860 62 65 72 20 69 66 20 6e 65 63 65 73 73 61 72 79  ber if necessary
15870 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15880 33 4d 69 6e 69 6d 75 6d 46 69 6c 65 46 6f 72 6d  3MinimumFileForm
15890 61 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  at(Parse *pParse
158a0 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 6d  , int iDb, int m
158b0 69 6e 46 6f 72 6d 61 74 29 7b 0a 20 20 56 64 62  inFormat){.  Vdb
158c0 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69  e *v;.  v = sqli
158d0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
158e0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
158f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15900 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f  dOp(v, OP_ReadCo
15910 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20  okie, iDb, 1);. 
15920 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
15930 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
15940 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15950 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
15960 67 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20  ger, minFormat, 
15970 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
15980 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
15990 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62  e, 0, sqlite3Vdb
159a0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
159b0 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
159c0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
159d0 6e 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72 6d 61  nteger, minForma
159e0 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
159f0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
15a00 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
15a10 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
15a20 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65  ** Fill the Inde
15a30 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72  x.aiRowEst[] arr
15a40 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20  ay with default 
15a50 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e  information - in
15a60 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20  formation.** to 
15a70 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20  be used when we 
15a80 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65  have not run the
15a90 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
15aa0 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74  ..**.** aiRowEst
15ab0 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74  [0] is suppose t
15ac0 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
15ad0 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
15ae0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a   in the index..*
15af0 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f  * Since we do no
15b00 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20  t know, guess 1 
15b10 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45  million.  aiRowE
15b20 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69  st[1] is an esti
15b30 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  mate of the.** n
15b40 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
15b50 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
15b60 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
15b70 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68  ular value of th
15b80 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d  e.** first colum
15b90 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
15ba0 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20   aiRowEst[2] is 
15bb0 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
15bc0 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
15bd0 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20  rows that match 
15be0 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63  any particular c
15bf0 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74  ombiniation of t
15c00 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d  he first 2 colum
15c10 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64  ns.** of the ind
15c20 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  ex.  And so fort
15c30 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61  h.  It must alwa
15c40 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ys be the case t
15c50 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  hat.*.**        
15c60 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d     aiRowEst[N]<=
15c70 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a  aiRowEst[N-1].**
15c80 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
15c90 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20  Est[N]>=1.**.** 
15ca0 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c  Apart from that,
15cb0 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20   we have little 
15cc0 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73  to go on besides
15cd0 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f   intuition as to
15ce0 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74  .** how aiRowEst
15cf0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  [] should be ini
15d00 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e  tialized.  The n
15d10 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64  umbers generated
15d20 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73   here.** are bas
15d30 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61  ed on typical va
15d40 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63  lues found in ac
15d50 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f  tual indices..*/
15d60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
15d70 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78  aultRowEst(Index
15d80 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67   *pIdx){.  unsig
15d90 6e 65 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61  ned *a = pIdx->a
15da0 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69  iRowEst;.  int i
15db0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d 30  ;.  assert( a!=0
15dc0 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30   );.  a[0] = 100
15dd0 30 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49  0000;.  for(i=pI
15de0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d  dx->nColumn; i>=
15df0 35 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69  5; i--){.    a[i
15e00 5d 20 3d 20 35 3b 0a 20 20 7d 0a 20 20 77 68 69  ] = 5;.  }.  whi
15e10 6c 65 28 20 69 3e 3d 31 20 29 7b 0a 20 20 20 20  le( i>=1 ){.    
15e20 61 5b 69 5d 20 3d 20 31 31 20 2d 20 69 3b 0a 20  a[i] = 11 - i;. 
15e30 20 20 20 69 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66     i--;.  }.  if
15e40 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
15e50 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
15e60 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d  a[pIdx->nColumn]
15e70 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
15e80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15e90 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69  will drop an exi
15ea0 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65  sting named inde
15eb0 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  x.  This routine
15ec0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  .** implements t
15ed0 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  he DROP INDEX st
15ee0 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
15ef0 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65   sqlite3DropInde
15f00 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
15f10 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
15f20 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a   int ifExists){.
15f30 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
15f40 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
15f50 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
15f60 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
15f70 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
15f80 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
15f90 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
15fa0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
15fb0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
15fc0 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
15fd0 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51  c==1 );.  if( SQ
15fe0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
15ff0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
16000 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
16010 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
16020 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
16030 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
16040 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
16050 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
16060 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
16070 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
16080 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69  {.    if( !ifExi
16090 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sts ){.      sql
160a0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
160b0 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
160c0 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  dex: %S", pName,
160d0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   0);.    }.    p
160e0 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
160f0 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ma = 1;.    goto
16100 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
16110 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64  ;.  }.  if( pInd
16120 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b  ex->autoIndex ){
16130 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
16140 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
16150 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
16160 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20  ith UNIQUE ".   
16170 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b     "or PRIMARY K
16180 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EY constraint ca
16190 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22  nnot be dropped"
161a0 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
161b0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
161c0 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
161d0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
161e0 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  (db, pIndex->pSc
161f0 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53  hema);.#ifndef S
16200 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
16210 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
16220 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
16230 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20  TE_DROP_INDEX;. 
16240 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
16250 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
16260 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
16270 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
16280 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
16290 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
162a0 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
162b0 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Db);.    if( sql
162c0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
162d0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
162e0 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
162f0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
16300 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
16310 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16320 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
16330 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
16340 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
16350 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
16360 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
16370 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
16380 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
16390 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
163a0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
163b0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
163c0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
163d0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
163e0 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
163f0 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
16400 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
16410 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
16420 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
16430 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
16440 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
16450 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
16460 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
16470 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  .%s WHERE name=%
16480 51 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61  Q",.       db->a
16490 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
164a0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
164b0 2c 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ,.       pIndex-
164c0 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
164d0 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
164e0 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62  ookie(db, v, iDb
164f0 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  );.    destroyRo
16500 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
16510 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  Index->tnum, iDb
16520 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16530 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70  beOp3(v, OP_Drop
16540 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 70  Index, iDb, 0, p
16550 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Index->zName, 0)
16560 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
16570 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
16580 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
16590 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
165a0 70 41 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e  pArray is a poin
165b0 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20  ter to an array 
165c0 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 45 61 63  of objects.  Eac
165d0 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a  h object in the.
165e0 2a 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e  ** array is szEn
165f0 74 72 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  try bytes in siz
16600 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
16610 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77   allocates a new
16620 0a 2a 2a 20 6f 62 6a 65 63 74 20 6f 6e 20 74 68  .** object on th
16630 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61 72 72  e end of the arr
16640 61 79 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e 74  ay..**.** *pnEnt
16650 72 79 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ry is the number
16660 20 6f 66 20 65 6e 74 72 69 65 73 20 61 6c 72 65   of entries alre
16670 61 64 79 20 69 6e 20 75 73 65 2e 20 20 2a 70 6e  ady in use.  *pn
16680 41 6c 6c 6f 63 20 69 73 0a 2a 2a 20 74 68 65 20  Alloc is.** the 
16690 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63  previously alloc
166a0 61 74 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65  ated size of the
166b0 20 61 72 72 61 79 2e 20 20 69 6e 69 74 53 69 7a   array.  initSiz
166c0 65 20 69 73 20 74 68 65 0a 2a 2a 20 73 75 67 67  e is the.** sugg
166d0 65 73 74 65 64 20 69 6e 69 74 69 61 6c 20 61 72  ested initial ar
166e0 72 61 79 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  ray size allocat
166f0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ion..**.** The i
16700 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20  ndex of the new 
16710 65 6e 74 72 79 20 69 73 20 72 65 74 75 72 6e 65  entry is returne
16720 64 20 69 6e 20 2a 70 49 64 78 2e 0a 2a 2a 0a 2a  d in *pIdx..**.*
16730 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
16740 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
16750 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66   to the array of
16760 20 6f 62 6a 65 63 74 73 2e 20 20 54 68 69 73 0a   objects.  This.
16770 2a 2a 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  ** might be the 
16780 73 61 6d 65 20 61 73 20 74 68 65 20 70 41 72 72  same as the pArr
16790 61 79 20 70 61 72 61 6d 65 74 65 72 20 6f 72 20  ay parameter or 
167a0 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 64 69  it might be a di
167b0 66 66 65 72 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74  fferent.** point
167c0 65 72 20 69 66 20 74 68 65 20 61 72 72 61 79 20  er if the array 
167d0 77 61 73 20 72 65 73 69 7a 65 64 2e 0a 2a 2f 0a  was resized..*/.
167e0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72  void *sqlite3Arr
167f0 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71  ayAllocate(.  sq
16800 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
16810 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  /* Connection to
16820 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f   notify of mallo
16830 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20  c failures */.  
16840 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20  void *pArray,   
16850 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62    /* Array of ob
16860 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65  jects.  Might be
16870 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a   reallocated */.
16880 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20    int szEntry,  
16890 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65      /* Size of e
168a0 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  ach object in th
168b0 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  e array */.  int
168c0 20 69 6e 69 74 53 69 7a 65 2c 20 20 20 20 20 2f   initSize,     /
168d0 2a 20 53 75 67 67 65 73 74 65 64 20 69 6e 69 74  * Suggested init
168e0 69 61 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20  ial allocation, 
168f0 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  in elements */. 
16900 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20   int *pnEntry,  
16910 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16920 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c  objects currentl
16930 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e  y in use */.  in
16940 74 20 2a 70 6e 41 6c 6c 6f 63 2c 20 20 20 20 20  t *pnAlloc,     
16950 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20  /* Current size 
16960 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  of the allocatio
16970 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a  n, in elements *
16980 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20  /.  int *pIdx   
16990 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
169a0 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65  he index of a ne
169b0 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29  w slot here */.)
169c0 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  {.  char *z;.  i
169d0 66 28 20 2a 70 6e 45 6e 74 72 79 20 3e 3d 20 2a  f( *pnEntry >= *
169e0 70 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 76  pnAlloc ){.    v
169f0 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  oid *pNew;.    i
16a00 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20  nt newSize;.    
16a10 6e 65 77 53 69 7a 65 20 3d 20 28 2a 70 6e 41 6c  newSize = (*pnAl
16a20 6c 6f 63 29 2a 32 20 2b 20 69 6e 69 74 53 69 7a  loc)*2 + initSiz
16a30 65 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  e;.    pNew = sq
16a40 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
16a50 62 2c 20 70 41 72 72 61 79 2c 20 6e 65 77 53 69  b, pArray, newSi
16a60 7a 65 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20  ze*szEntry);.   
16a70 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
16a80 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31        *pIdx = -1
16a90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
16aa0 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Array;.    }.   
16ab0 20 2a 70 6e 41 6c 6c 6f 63 20 3d 20 6e 65 77 53   *pnAlloc = newS
16ac0 69 7a 65 3b 0a 20 20 20 20 70 41 72 72 61 79 20  ize;.    pArray 
16ad0 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20  = pNew;.  }.  z 
16ae0 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b  = (char*)pArray;
16af0 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 2a 70 6e  .  memset(&z[*pn
16b00 45 6e 74 72 79 20 2a 20 73 7a 45 6e 74 72 79 5d  Entry * szEntry]
16b10 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20  , 0, szEntry);. 
16b20 20 2a 70 49 64 78 20 3d 20 2a 70 6e 45 6e 74 72   *pIdx = *pnEntr
16b30 79 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b  y;.  ++*pnEntry;
16b40 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79  .  return pArray
16b50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
16b60 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
16b70 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
16b80 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
16b90 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
16ba0 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
16bb0 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
16bc0 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
16bd0 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
16be0 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
16bf0 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
16c00 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nd(sqlite3 *db, 
16c10 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  IdList *pList, T
16c20 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
16c30 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
16c40 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
16c50 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
16c60 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
16c70 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
16c80 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
16c90 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
16ca0 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
16cb0 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d   0;.  }.  pList-
16cc0 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  >a = sqlite3Arra
16cd0 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
16ce0 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74   db,.      pList
16cf0 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f  ->a,.      sizeo
16d00 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a  f(pList->a[0]),.
16d10 20 20 20 20 20 20 35 2c 0a 20 20 20 20 20 20 26        5,.      &
16d20 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20  pList->nId,.    
16d30 20 20 26 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63    &pList->nAlloc
16d40 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  ,.      &i.  );.
16d50 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
16d60 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
16d70 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
16d80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
16d90 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
16da0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
16db0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
16dc0 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  oken);.  return 
16dd0 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
16de0 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74  Delete an IdList
16df0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16e00 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64  3IdListDelete(Id
16e10 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
16e20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
16e30 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
16e40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
16e50 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
16e60 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16e70 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
16e80 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
16e90 33 5f 66 72 65 65 28 70 4c 69 73 74 2d 3e 61 29  3_free(pList->a)
16ea0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
16eb0 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
16ec0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
16ed0 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
16ee0 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
16ef0 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
16f00 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
16f10 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
16f20 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
16f30 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
16f40 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
16f50 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
16f60 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
16f70 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
16f80 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
16f90 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
16fa0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
16fb0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
16fc0 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
16fd0 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
16fe0 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
16ff0 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62  Append a new tab
17000 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67  le name to the g
17010 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43  iven SrcList.  C
17020 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c  reate a new SrcL
17030 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
17040 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  e.  A new entry 
17050 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  is created in th
17060 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69  e SrcList even i
17070 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
17080 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72  ..**.** A new Sr
17090 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  cList is returne
170a0 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
170b0 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a  lloc() fails..**
170c0 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65  .** If pDatabase
170d0 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74   is not null, it
170e0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
170f0 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74  table has an opt
17100 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ional.** databas
17110 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20  e name prefix.  
17120 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74  Like this:  "dat
17130 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54  abase.table".  T
17140 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  he pDatabase.** 
17150 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61  points to the ta
17160 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
17170 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74   pTable points t
17180 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  o the database n
17190 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c  ame..** The SrcL
171a0 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69  ist.a[].zName fi
171b0 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69  eld is filled wi
171c0 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  th the table nam
171d0 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a  e which might.**
171e0 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   come from pTabl
171f0 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20  e (if pDatabase 
17200 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d  is NULL) or from
17210 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a   pDatabase.  .**
17220 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61   SrcList.a[].zDa
17230 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64  tabase is filled
17240 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
17250 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61  se name from pTa
17260 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20  ble,.** or with 
17270 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62  NULL if no datab
17280 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ase is specified
17290 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
172a0 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20   words, if call 
172b0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
172c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
172d0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
172e0 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,0);.**.** Th
172f0 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20  en B is a table 
17300 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
17310 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e  abase name is un
17320 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63  specified.  If c
17330 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68  alled.** like th
17340 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
17350 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
17360 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b  Append(D,A,B,C);
17370 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73  .**.** Then C is
17380 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
17390 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74  and B is the dat
173a0 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53  abase name..*/.S
173b0 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
173c0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  rcListAppend(.  
173d0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
173e0 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
173f0 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d  n to notify of m
17400 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a  alloc failures *
17410 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  /.  SrcList *pLi
17420 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e  st,     /* Appen
17430 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73  d to this SrcLis
17440 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20  t. NULL creates 
17450 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f  a new SrcList */
17460 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
17470 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  ,      /* Table 
17480 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54  to append */.  T
17490 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20  oken *pDatabase 
174a0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f     /* Database o
174b0 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29  f the table */.)
174c0 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
174d0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
174e0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
174f0 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
17500 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
17510 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63  o(db, sizeof(Src
17520 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
17530 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
17540 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
17550 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d  >nAlloc = 1;.  }
17560 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53  .  if( pList->nS
17570 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  rc>=pList->nAllo
17580 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  c ){.    SrcList
17590 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73   *pNew;.    pLis
175a0 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a  t->nAlloc *= 2;.
175b0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
175c0 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
175d0 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pList,.         
175e0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c        sizeof(*pL
175f0 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e  ist) + (pList->n
17600 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28  Alloc-1)*sizeof(
17610 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a  pList->a[0]) );.
17620 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
17630 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
17640 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  SrcListDelete(pL
17650 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ist);.      retu
17660 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
17670 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pList = pNew;.  
17680 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69  }.  pItem = &pLi
17690 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
176a0 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  c];.  memset(pIt
176b0 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c  em, 0, sizeof(pL
176c0 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69  ist->a[0]));.  i
176d0 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
176e0 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20  pDatabase->z==0 
176f0 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  ){.    pDatabase
17700 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
17710 70 44 61 74 61 62 61 73 65 20 26 26 20 70 54 61  pDatabase && pTa
17720 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e  ble ){.    Token
17730 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62   *pTemp = pDatab
17740 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61  ase;.    pDataba
17750 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20  se = pTable;.   
17760 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b   pTable = pTemp;
17770 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e  .  }.  pItem->zN
17780 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
17790 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
177a0 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d  Table);.  pItem-
177b0 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
177c0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
177d0 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73 65 29  n(db, pDatabase)
177e0 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  ;.  pItem->iCurs
177f0 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 49 74 65 6d  or = -1;.  pItem
17800 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20  ->isPopulated = 
17810 30 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63  0;.  pList->nSrc
17820 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  ++;.  return pLi
17830 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  st;.}../*.** Ass
17840 69 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20 61  ign cursors to a
17850 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53  ll tables in a S
17860 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
17870 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
17880 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65  ignCursors(Parse
17890 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
178a0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
178b0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
178c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
178d0 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73 74  ;.  assert(pList
178e0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
178f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
17900 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
17910 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
17920 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
17930 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
17940 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
17950 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  if( pItem->iCurs
17960 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or>=0 ) break;. 
17970 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72       pItem->iCur
17980 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
17990 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
179a0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
179b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
179c0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
179d0 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49  rsors(pParse, pI
179e0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  tem->pSelect->pS
179f0 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
17a00 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
17a10 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
17a20 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69   SrcList includi
17a30 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74  ng all its subst
17a40 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ructure..*/.void
17a50 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
17a60 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70  elete(SrcList *p
17a70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
17a80 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
17a90 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
17aa0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
17ab0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74  eturn;.  for(pIt
17ac0 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
17ad0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
17ae0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
17af0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
17b00 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  (pItem->zDatabas
17b10 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
17b20 66 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  free(pItem->zNam
17b30 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
17b40 66 72 65 65 28 70 49 74 65 6d 2d 3e 7a 41 6c 69  free(pItem->zAli
17b50 61 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  as);.    sqlite3
17b60 44 65 6c 65 74 65 54 61 62 6c 65 28 70 49 74 65  DeleteTable(pIte
17b70 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71  m->pTab);.    sq
17b80 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
17b90 65 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  e(pItem->pSelect
17ba0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
17bb0 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e  prDelete(pItem->
17bc0 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
17bd0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49  3IdListDelete(pI
17be0 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
17bf0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
17c00 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
17c10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
17c20 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
17c30 70 61 72 73 65 72 20 74 6f 20 61 64 64 20 61 20  parser to add a 
17c40 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a  new term to the.
17c50 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77  ** end of a grow
17c60 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  ing FROM clause.
17c70 20 20 54 68 65 20 22 70 22 20 70 61 72 61 6d 65    The "p" parame
17c80 74 65 72 20 69 73 20 74 68 65 20 70 61 72 74 20  ter is the part 
17c90 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  of.** the FROM c
17ca0 6c 61 75 73 65 20 74 68 61 74 20 68 61 73 20 61  lause that has a
17cb0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73  lready been cons
17cc0 74 72 75 63 74 65 64 2e 20 20 22 70 22 20 69 73  tructed.  "p" is
17cd0 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73   NULL.** if this
17ce0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65   is the first te
17cf0 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
17d00 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61  lause.  pTable a
17d10 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  nd pDatabase.** 
17d20 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  are the name of 
17d30 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61  the table and da
17d40 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20  tabase named in 
17d50 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
17d60 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61  term..** pDataba
17d70 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  se is NULL if th
17d80 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
17d90 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73  qualifier is mis
17da0 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73  sing - the.** us
17db0 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68  ual case.  If th
17dc0 65 20 74 65 72 6d 20 68 61 73 20 61 20 61 6c 69  e term has a ali
17dd0 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20  as, then pAlias 
17de0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
17df0 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49   alias token.  I
17e00 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20  f the term is a 
17e10 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70  subquery, then p
17e20 53 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a  Subquery is the.
17e30 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
17e40 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62  ent that the sub
17e50 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20  query encodes.  
17e60 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a  The pTable and.*
17e70 2a 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61  * pDatabase para
17e80 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20  meters are NULL 
17e90 66 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20  for subqueries. 
17ea0 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73   The pOn and pUs
17eb0 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ing.** parameter
17ec0 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  s are the conten
17ed0 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20  t of the ON and 
17ee0 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a  USING clauses..*
17ef0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65  *.** Return a ne
17f00 77 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20  w SrcList which 
17f10 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46  encodes is the F
17f20 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77  ROM with the new
17f30 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a  .** term added..
17f40 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
17f50 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
17f60 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73  FromTerm(.  Pars
17f70 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
17f80 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
17f90 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
17fa0 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ist *p,         
17fb0 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
17fc0 70 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  part of the FROM
17fd0 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20   clause already 
17fe0 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  seen */.  Token 
17ff0 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20  *pTable,        
18000 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
18010 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f   table to add to
18020 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18030 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
18040 74 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a  tabase,       /*
18050 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
18060 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
18070 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b   pTable */.  Tok
18080 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20  en *pAlias,     
18090 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
180a0 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
180b0 68 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73  he AS subexpress
180c0 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
180d0 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20  *pSubquery,     
180e0 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75   /* A subquery u
180f0 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
18100 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  a table name */.
18110 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20    Expr *pOn,    
18120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18130 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
18140 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74  join */.  IdList
18150 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20   *pUsing        
18160 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63    /* The USING c
18170 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
18180 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
18190 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
181a0 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
181b0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
181c0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63    p = sqlite3Src
181d0 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70  ListAppend(db, p
181e0 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62  , pTable, pDatab
181f0 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
18200 20 7c 7c 20 70 2d 3e 6e 53 72 63 3d 3d 30 20 29   || p->nSrc==0 )
18210 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
18220 72 44 65 6c 65 74 65 28 70 4f 6e 29 3b 0a 20 20  rDelete(pOn);.  
18230 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
18240 65 6c 65 74 65 28 70 55 73 69 6e 67 29 3b 0a 20  elete(pUsing);. 
18250 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
18260 44 65 6c 65 74 65 28 70 53 75 62 71 75 65 72 79  Delete(pSubquery
18270 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 3b  );.    return p;
18280 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
18290 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
182a0 0a 20 20 69 66 28 20 70 41 6c 69 61 73 20 26 26  .  if( pAlias &&
182b0 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20   pAlias->n ){.  
182c0 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20    pItem->zAlias 
182d0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
182e0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61  mToken(db, pAlia
182f0 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  s);.  }.  pItem-
18300 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71  >pSelect = pSubq
18310 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70  uery;.  pItem->p
18320 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65  On = pOn;.  pIte
18330 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69  m->pUsing = pUsi
18340 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ng;.  return p;.
18350 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75  }../*.** When bu
18360 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d  ilding up a FROM
18370 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70   clause in the p
18380 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20  arser, the join 
18390 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69  operator.** is i
183a0 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65  nitially attache
183b0 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70  d to the left op
183c0 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20  erand.  But the 
183d0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a  code generator.*
183e0 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f  * expects the jo
183f0 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62  in operator to b
18400 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f  e on the right o
18410 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f  perand.  This ro
18420 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20  utine.** Shifts 
18430 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  all join operato
18440 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  rs from left to 
18450 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74  right for an ent
18460 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75  ire FROM.** clau
18470 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  se..**.** Exampl
18480 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a  e: Suppose the j
18490 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73  oin is like this
184a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
184b0 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73    A natural cros
184c0 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54  s join B.**.** T
184d0 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22  he operator is "
184e0 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f  natural cross jo
184f0 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20  in".  The A and 
18500 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73  B operands are s
18510 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61  tored.** in p->a
18520 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c  [0] and p->a[1],
18530 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20   respectively.  
18540 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74 69  The parser initi
18550 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a  ally stores the.
18560 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  ** operator with
18570 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   A.  This routin
18580 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f 70  e shifts that op
18590 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42  erator over to B
185a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
185b0 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69  3SrcListShiftJoi
185c0 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70  nType(SrcList *p
185d0 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  ){.  if( p && p-
185e0 3e 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  >a ){.    int i;
185f0 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53  .    for(i=p->nS
18600 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  rc-1; i>0; i--){
18610 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a  .      p->a[i].j
18620 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69  ointype = p->a[i
18630 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  -1].jointype;.  
18640 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e    }.    p->a[0].
18650 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
18660 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  }.}../*.** Begin
18670 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
18680 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
18690 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ginTransaction(P
186a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
186b0 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  t type){.  sqlit
186c0 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
186d0 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  v;.  int i;..  i
186e0 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
186f0 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
18700 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
18710 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
18720 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
18730 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
18740 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
18750 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
18760 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
18770 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
18780 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30  TION, "BEGIN", 0
18790 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  , 0) ) return;..
187a0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
187b0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
187c0 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b  if( !v ) return;
187d0 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f  .  if( type!=TK_
187e0 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20  DEFERRED ){.    
187f0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
18800 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
18810 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18820 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
18830 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b  on, i, (type==TK
18840 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a  _EXCLUSIVE)+1);.
18850 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18860 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29  eUsesBtree(v, i)
18870 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
18880 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
18890 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
188a0 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 0);.}../*.**
188b0 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61   Commit a transa
188c0 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
188d0 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73  lite3CommitTrans
188e0 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
188f0 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
18900 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
18910 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
18920 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
18930 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
18940 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
18950 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
18960 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
18970 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
18980 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
18990 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
189a0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
189b0 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d  ANSACTION, "COMM
189c0 49 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IT", 0, 0) ) ret
189d0 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
189e0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
189f0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
18a00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18a10 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  dOp(v, OP_AutoCo
18a20 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  mmit, 1, 0);.  }
18a30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
18a40 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
18a50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18a60 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74  RollbackTransact
18a70 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
18a80 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
18a90 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
18aa0 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
18ab0 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
18ac0 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  )==0 || db->aDb[
18ad0 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
18ae0 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
18af0 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
18b00 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
18b10 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
18b20 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
18b30 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
18b40 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43  ACTION, "ROLLBAC
18b50 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  K", 0, 0) ) retu
18b60 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  rn;..  v = sqlit
18b70 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
18b80 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
18b90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18ba0 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  Op(v, OP_AutoCom
18bb0 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a  mit, 1, 1);.  }.
18bc0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
18bd0 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
18be0 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64  base is open and
18bf0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
18c00 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  se.  Return.** t
18c10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
18c20 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20  ors.  Leave any 
18c30 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
18c40 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
18c50 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
18c60 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
18c70 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50  tabase(Parse *pP
18c80 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
18c90 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
18ca0 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  b;.  if( db->aDb
18cb0 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70  [1].pBt==0 && !p
18cc0 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
18cd0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
18ce0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
18cf0 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20  nt flags = .    
18d00 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
18d10 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20  N_READWRITE |.  
18d20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
18d30 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
18d40 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
18d50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
18d60 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
18d70 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
18d80 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  SE |.          S
18d90 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
18da0 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  DB;..    rc = sq
18db0 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72  lite3BtreeFactor
18dc0 79 28 64 62 2c 20 30 2c 20 30 2c 20 53 51 4c 49  y(db, 0, 0, SQLI
18dd0 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
18de0 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 0a 20 20  _SIZE, flags,.  
18df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
18e10 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b  db->aDb[1].pBt);
18e20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18e30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18e40 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18e50 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
18e60 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
18e70 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20  ary database ". 
18e80 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72         "file for
18e90 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61   storing tempora
18ea0 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ry tables");.   
18eb0 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
18ec0 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
18ed0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
18ee0 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21 64  ( db->flags & !d
18ef0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
18f00 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
18f10 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
18f20 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  ns(db->aDb[1].pB
18f30 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 1);.      if(
18f40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18f50 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18f60 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18f70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74  , "unable to get
18f80 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e   a write lock on
18f90 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74 68   ".          "th
18fa0 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  e temporary data
18fb0 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20  base file");.   
18fc0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
18fd0 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 65  = rc;.        re
18fe0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
18ff0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
19000 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ( db->aDb[1].pSc
19010 68 65 6d 61 20 29 3b 0a 20 20 7d 0a 20 20 72 65  hema );.  }.  re
19020 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
19030 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
19040 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65  ode that will ve
19050 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
19060 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74  cookie and start
19070 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73  .** a read-trans
19080 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e  action for all n
19090 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  amed database fi
190a0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  les..**.** It is
190b0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
190c0 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  all schema cooki
190d0 65 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61  es be verified a
190e0 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74  nd all.** read t
190f0 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73  ransactions be s
19100 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e  tarted before an
19110 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70  ything else happ
19120 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44  ens in.** the VD
19130 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74  BE program.  But
19140 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
19150 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  n be called afte
19160 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20  r much other.** 
19170 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65  code has been ge
19180 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72  nerated.  So her
19190 65 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a  e is what we do:
191a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
191b0 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
191c0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65  ne is called, we
191d0 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f   code an OP_Goto
191e0 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75   that.** will ju
191f0 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  mp to a subrouti
19200 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ne at the end of
19210 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54   the program.  T
19220 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64  hen we.** record
19230 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
19240 74 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73  that needs its s
19250 63 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69  chema verified i
19260 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d  n the.** pParse-
19270 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c  >cookieMask fiel
19280 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72  d.  Later, after
19290 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20   all other code 
192a0 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65  has been.** gene
192b0 72 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f  rated, the subro
192c0 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20  utine that does 
192d0 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
192e0 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  ications and.** 
192f0 73 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73  starts the trans
19300 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  actions will be 
19310 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50  coded and the OP
19320 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a  _Goto P2 value.*
19330 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  * will be made t
19340 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20  o point to that 
19350 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
19360 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74   generation of t
19370 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72  he.** cookie ver
19380 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75  ification subrou
19390 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e  tine code happen
193a0 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69  s in sqlite3Fini
193b0 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a  shCoding()..**.*
193c0 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20  * If iDb<0 then 
193d0 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f  code the OP_Goto
193e0 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65   only - don't se
193f0 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79  t flag to verify
19400 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f   the.** schema o
19410 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e  n any databases.
19420 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
19430 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74  ed to position t
19440 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61  he OP_Goto.** ea
19450 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c  rly in the code,
19460 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20   before we know 
19470 69 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  if any database 
19480 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75  tables will be u
19490 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
194a0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
194b0 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
194c0 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
194d0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
194e0 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61  dbe *v;.  int ma
194f0 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  sk;..  v = sqlit
19500 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
19510 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
19520 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73  return;  /* This
19530 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66   only happens if
19540 20 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69   there was a pri
19550 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62  or error */.  db
19560 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
19570 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f   if( pParse->coo
19580 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20  kieGoto==0 ){.  
19590 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
195a0 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64  Goto = sqlite3Vd
195b0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
195c0 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d  to, 0, 0)+1;.  }
195d0 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b  .  if( iDb>=0 ){
195e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
195f0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
19600 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
19610 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69  iDb].pBt!=0 || i
19620 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  Db==1 );.    ass
19630 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f  ert( iDb<SQLITE_
19640 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29  MAX_ATTACHED+2 )
19650 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c  ;.    mask = 1<<
19660 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70 50  iDb;.    if( (pP
19670 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
19680 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
19690 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f       pParse->coo
196a0 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  kieMask |= mask;
196b0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
196c0 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20  ookieValue[iDb] 
196d0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
196e0 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
196f0 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69 66 28  ookie;.      if(
19700 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
19710 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
19720 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65     sqlite3OpenTe
19730 6d 70 44 61 74 61 62 61 73 65 28 70 50 61 72 73  mpDatabase(pPars
19740 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
19750 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
19760 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
19770 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20  e that prepares 
19780 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65  for doing an ope
19790 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d  ration that.** m
197a0 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
197b0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
197c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61  This routine sta
197d0 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61  rts a new transa
197e0 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20  ction if we are 
197f0 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68  not already with
19800 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  in.** a transact
19810 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20  ion.  If we are 
19820 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61  already within a
19830 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
19840 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a  en a checkpoint.
19850 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65  ** is set if the
19860 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61   setStatement pa
19870 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e  rameter is true.
19880 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73    A checkpoint s
19890 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20  hould.** be set 
198a0 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  for operations t
198b0 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28  hat might fail (
198c0 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61  due to a constra
198d0 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20  int) part of.** 
198e0 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20  the way through 
198f0 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e  and which will n
19900 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65  eed to undo some
19910 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20   writes without 
19920 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c  having to.** rol
19930 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20  lback the whole 
19940 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f  transaction.  Fo
19950 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65  r operations whe
19960 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  re all constrain
19970 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65  ts.** can be che
19980 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  cked before any 
19990 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
199a0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
199b0 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a  , it is never.**
199c0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e   necessary to un
199d0 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74  do a write and t
199e0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68  he checkpoint sh
199f0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e  ould not be set.
19a00 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61  .**.** Only data
19a10 62 61 73 65 20 69 44 62 20 61 6e 64 20 74 68 65  base iDb and the
19a20 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61   temp database a
19a30 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  re made writable
19a40 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a   by this call..*
19a50 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20 74 68 65  * If iDb==0, the
19a60 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e 64 20 74  n the main and t
19a70 65 6d 70 20 64 61 74 61 62 61 73 65 73 20 61 72  emp databases ar
19a80 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  e made writable.
19a90 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20     If.** iDb==1 
19aa0 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65  then only the te
19ab0 6d 70 20 64 61 74 61 62 61 73 65 20 69 73 20 6d  mp database is m
19ac0 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 49  ade writable.  I
19ad0 66 20 69 44 62 3e 31 20 74 68 65 6e 20 74 68 65  f iDb>1 then the
19ae0 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61 75  .** specified au
19af0 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
19b00 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61   and the temp da
19b10 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20  tabase are made 
19b20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69  writable..*/.voi
19b30 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72  d sqlite3BeginWr
19b40 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
19b50 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
19b60 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e  setStatement, in
19b70 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
19b80 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
19b90 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
19ba0 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
19bb0 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
19bc0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
19bd0 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61 72 73  e, iDb);.  pPars
19be0 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20  e->writeMask |= 
19bf0 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20 73 65  1<<iDb;.  if( se
19c00 74 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 50  tStatement && pP
19c10 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
19c20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
19c30 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
19c40 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29  atement, iDb, 0)
19c50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 4f 4d 49  ;.  }.  if( (OMI
19c60 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 44 62 21  T_TEMPDB || iDb!
19c70 3d 31 29 20 26 26 20 70 50 61 72 73 65 2d 3e 64  =1) && pParse->d
19c80 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 21 3d 30  b->aDb[1].pBt!=0
19c90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
19ca0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
19cb0 6f 6e 28 70 50 61 72 73 65 2c 20 73 65 74 53 74  on(pParse, setSt
19cc0 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d  atement, 1);.  }
19cd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
19ce0 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78  to see if pIndex
19cf0 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74   uses the collat
19d00 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
19d10 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  ll.  Return.** t
19d20 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61  rue if it does a
19d30 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64  nd false if it d
19d40 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e  oes not..*/.#ifn
19d50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19d60 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69  REINDEX.static i
19d70 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  nt collationMatc
19d80 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  h(const char *zC
19d90 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  oll, Index *pInd
19da0 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ex){.  int i;.  
19db0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65  for(i=0; i<pInde
19dc0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
19dd0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
19de0 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a   *z = pIndex->az
19df0 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Coll[i];.    if(
19e00 20 7a 3d 3d 7a 43 6f 6c 6c 20 7c 7c 20 28 7a 20   z==zColl || (z 
19e10 26 26 20 7a 43 6f 6c 6c 20 26 26 20 30 3d 3d 73  && zColl && 0==s
19e20 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
19e30 20 7a 43 6f 6c 6c 29 29 20 29 7b 0a 20 20 20 20   zColl)) ){.    
19e40 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
19e50 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
19e60 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
19e70 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
19e80 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20  indices of pTab 
19e90 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c  that use the col
19ea0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
19eb0 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f  pColl..** If pCo
19ec0 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
19ed0 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
19ee0 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66   of pTab..*/.#if
19ef0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19f00 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
19f10 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c  void reindexTabl
19f20 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
19f30 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68   Table *pTab, ch
19f40 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29  ar const *zColl)
19f50 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
19f60 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
19f70 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
19f80 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
19f90 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65   */..  for(pInde
19fa0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
19fb0 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
19fc0 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  Index->pNext){. 
19fd0 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20     if( zColl==0 
19fe0 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  || collationMatc
19ff0 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29  h(zColl, pIndex)
1a000 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
1a010 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
1a020 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
1a030 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
1a040 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ma);.      sqlit
1a050 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1a060 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
1a070 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
1a080 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
1a090 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
1a0a0 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  -1);.    }.  }.}
1a0b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
1a0c0 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
1a0d0 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c  ices of all tabl
1a0e0 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
1a0f0 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a  ses where the.**
1a100 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65   indices use the
1a110 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1a120 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70  nce pColl.  If p
1a130 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
1a140 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e  ompute.** all in
1a150 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65  dices everywhere
1a160 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
1a170 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
1a180 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
1a190 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61  ndexDatabases(Pa
1a1a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61  rse *pParse, cha
1a1b0 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
1a1c0 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a1e0 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * A single datab
1a1f0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
1a200 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a210 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
1a220 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
1a230 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
1a240 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1a250 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
1a260 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
1a270 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20  .  HashElem *k; 
1a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a290 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1a2a0 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62  er tables in pDb
1a2b0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1a2c0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1a2d0 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
1a2e0 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
1a2f0 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44  .  for(iDb=0, pD
1a300 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64  b=db->aDb; iDb<d
1a310 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70  b->nDb; iDb++, p
1a320 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72  Db++){.    asser
1a330 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20  t( pDb!=0 );.   
1a340 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73   for(k=sqliteHas
1a350 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63  hFirst(&pDb->pSc
1a360 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
1a370 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68   k; k=sqliteHash
1a380 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20  Next(k)){.      
1a390 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73  pTab = (Table*)s
1a3a0 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29  qliteHashData(k)
1a3b0 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54  ;.      reindexT
1a3c0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
1a3d0 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  b, zColl);.    }
1a3e0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
1a3f0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1a400 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44  de for the REIND
1a410 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
1a420 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
1a430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a440 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31              -- 1
1a450 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
1a460 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20  EX  <collation> 
1a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
1a480 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   2.**        REI
1a490 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
1a4a0 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20  >.?<tablename>  
1a4b0 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 3.**        R
1a4c0 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
1a4d0 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e  se>.?<indexname>
1a4e0 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72    -- 4.**.** For
1a4f0 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69  m 1 causes all i
1a500 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74  ndices in all at
1a510 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
1a520 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a   to be rebuilt..
1a530 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c  ** Form 2 rebuil
1a540 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  ds all indices i
1a550 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
1a560 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d  that use the nam
1a570 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20  ed.** collating 
1a580 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73  function.  Forms
1a590 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64   3 and 4 rebuild
1a5a0 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
1a5b0 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63   or all.** indic
1a5c0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
1a5d0 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  th the named tab
1a5e0 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  le..*/.#ifndef S
1a5f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
1a600 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  EX.void sqlite3R
1a610 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  eindex(Parse *pP
1a620 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
1a630 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  me1, Token *pNam
1a640 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e2){.  CollSeq *
1a650 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
1a660 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
1a670 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72  sequence to be r
1a680 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c  eindexed, or NUL
1a690 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  L */.  char *z; 
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6b0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
1a6c0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a  table or index *
1a6d0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1a6e0 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
1a6f0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
1a700 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62  atabase */.  Tab
1a710 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
1a720 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
1a730 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
1a740 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ase */.  Index *
1a750 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
1a760 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
1a770 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1a780 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
1a790 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
1a7a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1a7b0 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
1a7c0 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
1a7d0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1a7e0 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
1a7f0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1a800 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a  */.  Token *pObj
1a810 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
1a820 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1a830 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
1a840 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a  o be reindexed *
1a850 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
1a860 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
1a870 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1a880 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
1a890 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
1a8a0 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
1a8b0 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
1a8c0 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
1a8d0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
1a8e0 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
1a8f0 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
1a900 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  n;.  }..  if( pN
1a910 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65  ame1==0 || pName
1a920 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72  1->z==0 ){.    r
1a930 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
1a940 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20  pParse, 0);.    
1a950 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
1a960 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c  if( pName2==0 ||
1a970 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b   pName2->z==0 ){
1a980 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  .    char *zColl
1a990 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
1a9a0 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a  ame1->z );.    z
1a9b0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  Coll = sqlite3Na
1a9c0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
1a9d0 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b  se->db, pName1);
1a9e0 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20  .    if( !zColl 
1a9f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43  ) return;.    pC
1aa00 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
1aa10 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
1aa20 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 2c  (db), zColl, -1,
1aa30 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   0);.    if( pCo
1aa40 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
1aa50 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  zColl ){.       
1aa60 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
1aa70 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  s(pParse, zColl)
1aa80 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1aa90 33 5f 66 72 65 65 28 7a 43 6f 6c 6c 29 3b 0a 20  3_free(zColl);. 
1aaa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1aab0 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  urn;.    }.    s
1aac0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c  qlite3_free(zCol
1aad0 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  l);.  }.  iDb = 
1aae0 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
1aaf0 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
1ab00 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a  1, pName2, &pObj
1ab10 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62  Name);.  if( iDb
1ab20 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  <0 ) return;.  z
1ab30 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1ab40 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a  omToken(db, pObj
1ab50 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  Name);.  if( z==
1ab60 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44  0 ) return;.  zD
1ab70 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
1ab80 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d  .zName;.  pTab =
1ab90 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
1aba0 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  e(db, z, zDb);. 
1abb0 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
1abc0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
1abd0 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a  arse, pTab, 0);.
1abe0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1abf0 28 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  (z);.    return;
1ac00 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
1ac10 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
1ac20 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
1ac30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
1ac40 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
1ac50 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
1ac60 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1ac70 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
1ac80 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69  .    sqlite3Refi
1ac90 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
1aca0 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
1acb0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
1acc0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1acd0 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
1ace0 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f  o identify the o
1acf0 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e  bject to be rein
1ad00 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69  dexed");.}.#endi
1ad10 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
1ad20 61 20 64 79 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f  a dynamicly allo
1ad30 63 61 74 65 64 20 4b 65 79 49 6e 66 6f 20 73 74  cated KeyInfo st
1ad40 72 75 63 74 75 72 65 20 74 68 61 74 20 63 61 6e  ructure that can
1ad50 20 62 65 20 75 73 65 64 0a 2a 2a 20 77 69 74 68   be used.** with
1ad60 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72 20   OP_OpenRead or 
1ad70 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 74 6f 20  OP_OpenWrite to 
1ad80 61 63 63 65 73 73 20 64 61 74 61 62 61 73 65 20  access database 
1ad90 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a  index pIdx..**.*
1ada0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1adb0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1adc0 65 20 6e 65 77 20 73 74 72 75 63 74 75 72 65 20  e new structure 
1add0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20  is returned. In 
1ade0 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65  this case.** the
1adf0 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
1ae00 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
1ae10 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
1ae20 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65  ) on the returne
1ae30 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20 49  d .** pointer. I
1ae40 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1ae50 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  s (out of memory
1ae60 20 6f 72 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c   or missing coll
1ae70 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71 75 65 6e  ation .** sequen
1ae80 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  ce), NULL is ret
1ae90 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 74  urned and the st
1aea0 61 74 65 20 6f 66 20 70 50 61 72 73 65 20 75 70  ate of pParse up
1aeb0 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63 74  dated to reflect
1aec0 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a  .** the error..*
1aed0 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74  /.KeyInfo *sqlit
1aee0 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 50  e3IndexKeyinfo(P
1aef0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
1af00 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e  dex *pIdx){.  in
1af10 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  t i;.  int nCol 
1af20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
1af30 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 20 3d 20  .  int nBytes = 
1af40 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
1af50 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f  + (nCol-1)*sizeo
1af60 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e 43  f(CollSeq*) + nC
1af70 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ol;.  KeyInfo *p
1af80 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20 2a  Key = (KeyInfo *
1af90 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
1afa0 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
1afb0 20 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28   nBytes);..  if(
1afc0 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65   pKey ){.    pKe
1afd0 79 2d 3e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  y->db = pParse->
1afe0 64 62 3b 0a 20 20 20 20 70 4b 65 79 2d 3e 61 53  db;.    pKey->aS
1aff0 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a  ortOrder = (u8 *
1b000 29 26 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e  )&(pKey->aColl[n
1b010 43 6f 6c 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  Col]);.    asser
1b020 74 28 20 26 70 4b 65 79 2d 3e 61 53 6f 72 74 4f  t( &pKey->aSortO
1b030 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28  rder[nCol]==&(((
1b040 75 38 20 2a 29 70 4b 65 79 29 5b 6e 42 79 74 65  u8 *)pKey)[nByte
1b050 73 5d 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  s]) );.    for(i
1b060 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
1b070 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  {.      char *zC
1b080 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
1b090 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73  ll[i];.      ass
1b0a0 65 72 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20  ert( zColl );.  
1b0b0 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b      pKey->aColl[
1b0c0 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  i] = sqlite3Loca
1b0d0 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
1b0e0 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 3b 0a 20 20  , zColl, -1);.  
1b0f0 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f      pKey->aSortO
1b100 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e  rder[i] = pIdx->
1b110 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20  aSortOrder[i];. 
1b120 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 2d 3e 6e     }.    pKey->n
1b130 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 20 20  Field = nCol;.  
1b140 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  }..  if( pParse-
1b150 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >nErr ){.    sql
1b160 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
1b170 0a 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20  .    pKey = 0;. 
1b180 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79   }.  return pKey
1b190 3b 0a 7d 0a                                      ;.}.