/ Hex Artifact Content
Login

Artifact d6d55f97abcb6f17ac3e9e7a1dd8c0db67db34fd:


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 39 39 20 32 30 30 38 2f 31 30 2f 32 32  1.499 2008/10/22
02f0: 20 31 30 3a 34 35 3a 33 38 20 64 61 6e 69 65 6c   10:45:38 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 73 71  = p->iDb;.    sq
0cc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
0cd0: 70 56 64 62 65 2c 20 4f 50 5f 54 61 62 6c 65 4c  pVdbe, OP_TableL
0ce0: 6f 63 6b 2c 20 70 31 2c 20 70 2d 3e 69 54 61 62  ock, p1, p->iTab
0cf0: 2c 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b  , p->isWriteLock
0d00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0d10: 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65          p->zName
0d20: 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
0d30: 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66  }.}.#else.  #def
0d40: 69 6e 65 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  ine codeTableLoc
0d50: 6b 73 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ks(x).#endif../*
0d60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
0d70: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
0d80: 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74   a single SQL st
0d90: 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e  atement has been
0da0: 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 61  .** parsed and a
0db0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 74 6f   VDBE program to
0dc0: 20 65 78 65 63 75 74 65 20 74 68 61 74 20 73 74   execute that st
0dd0: 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e  atement has been
0de0: 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20 20 54  .** prepared.  T
0df0: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 74 73  his routine puts
0e00: 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67 20 74   the finishing t
0e10: 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a  ouches on the.**
0e20: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 6e   VDBE program an
0e30: 64 20 72 65 73 65 74 73 20 74 68 65 20 70 50 61  d resets the pPa
0e40: 72 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f  rse structure fo
0e50: 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61  r the next.** pa
0e60: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  rse..**.** Note 
0e70: 74 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72  that if an error
0e80: 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69   occurred, it mi
0e90: 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
0ea0: 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20  that.** no VDBE 
0eb0: 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74  code was generat
0ec0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
0ed0: 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
0ee0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
0ef0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
0f00: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 64 62 20   Vdbe *v;..  db 
0f10: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
0f20: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
0f30: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
0f40: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73   if( pParse->nes
0f50: 74 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ted ) return;.  
0f60: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
0f70: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
0f80: 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61   Begin by genera
0f90: 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e  ting some termin
0fa0: 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68  ation code at th
0fb0: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a  e end of the.  *
0fc0: 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20  * vdbe program. 
0fd0: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
0fe0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
0ff0: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1000: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1010: 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a  p0(v, OP_Halt);.
1020: 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b  .    /* The cook
1030: 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73  ie mask contains
1040: 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   one bit for eac
1050: 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
1060: 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69  open..    ** (Bi
1070: 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c  t 0 is for main,
1080: 20 62 69 74 20 31 20 69 73 20 66 6f 72 20 74 65   bit 1 is for te
1090: 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  mp, and so forth
10a0: 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20 20 20  .)  Bits are.   
10b0: 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68   ** set for each
10c0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
10d0: 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74  s used.  Generat
10e0: 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20  e code to start 
10f0: 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  a.    ** transac
1100: 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65  tion on each use
1110: 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  d database and t
1120: 6f 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  o verify the sch
1130: 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a  ema cookie.    *
1140: 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64  * on each used d
1150: 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  atabase..    */.
1160: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1170: 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30 20 29 7b 0a  cookieGoto>0 ){.
1180: 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a        u32 mask;.
1190: 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
11a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11b0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 50 61 72  JumpHere(v, pPar
11c0: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31  se->cookieGoto-1
11d0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62  );.      for(iDb
11e0: 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c  =0, mask=1; iDb<
11f0: 64 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d  db->nDb; mask<<=
1200: 31 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20  1, iDb++){.     
1210: 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70     if( (mask & p
1220: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
1230: 6b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  k)==0 ) continue
1240: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1250: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
1260: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
1270: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1280: 32 28 76 2c 4f 50 5f 54 72 61 6e 73 61 63 74 69  2(v,OP_Transacti
1290: 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20 26  on, iDb, (mask &
12a0: 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61   pParse->writeMa
12b0: 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  sk)!=0);.       
12c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12d0: 70 32 28 76 2c 4f 50 5f 56 65 72 69 66 79 43 6f  p2(v,OP_VerifyCo
12e0: 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72 73  okie, iDb, pPars
12f0: 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  e->cookieValue[i
1300: 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69  Db]);.      }.#i
1310: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1320: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1330: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69       {.        i
1340: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
1350: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
1360: 3e 6e 56 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29  >nVtabLock; i++)
1370: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
1380: 20 2a 76 74 61 62 20 3d 20 28 63 68 61 72 20 2a   *vtab = (char *
1390: 29 70 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c  )pParse->apVtabL
13a0: 6f 63 6b 5b 69 5d 2d 3e 70 56 74 61 62 3b 0a 20  ock[i]->pVtab;. 
13b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13c0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
13d0: 5f 56 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30  _VBegin, 0, 0, 0
13e0: 2c 20 76 74 61 62 2c 20 50 34 5f 56 54 41 42 29  , vtab, P4_VTAB)
13f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1400: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74 61      pParse->nVta
1410: 62 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20  bLock = 0;.     
1420: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
1430: 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20 74 68 65   /* Once all the
1440: 20 63 6f 6f 6b 69 65 73 20 68 61 76 65 20 62 65   cookies have be
1450: 65 6e 20 76 65 72 69 66 69 65 64 20 61 6e 64 20  en verified and 
1460: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
1470: 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f  ned, .      ** o
1480: 62 74 61 69 6e 20 74 68 65 20 72 65 71 75 69 72  btain the requir
1490: 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20  ed table-locks. 
14a0: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
14b0: 75 6e 6c 65 73 73 20 74 68 65 20 0a 20 20 20 20  unless the .    
14c0: 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68    ** shared-cach
14d0: 65 20 66 65 61 74 75 72 65 20 69 73 20 65 6e 61  e feature is ena
14e0: 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bled..      */. 
14f0: 20 20 20 20 20 63 6f 64 65 54 61 62 6c 65 4c 6f       codeTableLo
1500: 63 6b 73 28 70 50 61 72 73 65 29 3b 0a 20 20 20  cks(pParse);.   
1510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1520: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1530: 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b   0, pParse->cook
1540: 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ieGoto);.    }..
1550: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1560: 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66  MIT_TRACE.    if
1570: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
1580: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 61   ){.      /* Cha
1590: 6e 67 65 20 74 68 65 20 50 34 20 61 72 67 75 6d  nge the P4 argum
15a0: 65 6e 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  ent of the first
15b0: 20 6f 70 63 6f 64 65 20 28 77 68 69 63 68 20 77   opcode (which w
15c0: 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 0a 20 20  ill always be.  
15d0: 20 20 20 20 2a 2a 20 61 6e 20 4f 50 5f 54 72 61      ** an OP_Tra
15e0: 63 65 29 20 74 6f 20 62 65 20 74 68 65 20 63 6f  ce) to be the co
15f0: 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
1600: 68 65 20 63 75 72 72 65 6e 74 20 53 51 4c 20 73  he current SQL s
1610: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
1620: 2a 2f 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  */.      VdbeOp 
1630: 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  *pOp = sqlite3Vd
1640: 62 65 47 65 74 4f 70 28 76 2c 20 30 29 3b 0a 20  beGetOp(v, 0);. 
1650: 20 20 20 20 20 69 66 28 20 70 4f 70 20 26 26 20       if( pOp && 
1660: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
1670: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
1680: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1690: 67 65 50 34 28 76 2c 20 30 2c 20 70 50 61 72 73  geP4(v, 0, pPars
16a0: 65 2d 3e 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d  e->zSql, pParse-
16b0: 3e 7a 54 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a  >zTail-pParse->z
16c0: 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sql);.      }.  
16d0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
16e0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
16f0: 2a 2f 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65  */.  }...  /* Ge
1700: 74 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  t the VDBE progr
1710: 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78 65  am ready for exe
1720: 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66  cution.  */.  if
1730: 28 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ( v && pParse->n
1740: 45 72 72 3d 3d 30 20 26 26 20 21 64 62 2d 3e 6d  Err==0 && !db->m
1750: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 23  allocFailed ){.#
1760: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1770: 55 47 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61  UG.    FILE *tra
1780: 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  ce = (db->flags 
1790: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61  & SQLITE_VdbeTra
17a0: 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20  ce)!=0 ? stdout 
17b0: 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  : 0;.    sqlite3
17c0: 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72 61  VdbeTrace(v, tra
17d0: 63 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ce);.#endif.    
17e0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
17f0: 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d  disableColCache=
1800: 3d 30 20 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c  =0 );  /* Disabl
1810: 65 73 20 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65  es and re-enable
1820: 73 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 73  s match */.    s
1830: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
1840: 61 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e  ady(v, pParse->n
1850: 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  Var, pParse->nMe
1860: 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20  m+3,.           
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1880: 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c 20 70 50  arse->nTab+3, pP
1890: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a  arse->explain);.
18a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
18b0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
18c0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
18d0: 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  esSet = 0;.  }el
18e0: 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72  se if( pParse->r
18f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1900: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1910: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1920: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61   }.  pParse->nTa
1930: 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  b = 0;.  pParse-
1940: 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61  >nMem = 0;.  pPa
1950: 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20  rse->nSet = 0;. 
1960: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
1970: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f  0;.  pParse->coo
1980: 6b 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70  kieMask = 0;.  p
1990: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
19a0: 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  o = 0;.}../*.** 
19b0: 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61  Run the parser a
19c0: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  nd code generato
19d0: 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e  r recursively in
19e0: 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61   order to genera
19f0: 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74  te.** code for t
1a00: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
1a10: 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20   given onto the 
1a20: 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73  end of the pPars
1a30: 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72  e context.** cur
1a40: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
1a50: 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e  struction.  When
1a60: 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72   the parser is r
1a70: 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a  un recursively.*
1a80: 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20  * this way, the 
1a90: 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73  final OP_Halt is
1aa0: 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e   not appended an
1ab0: 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69  d other initiali
1ac0: 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69  zation.** and fi
1ad0: 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73  nalization steps
1ae0: 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63   are omitted bec
1af0: 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68  ause those are h
1b00: 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a  andling by the.*
1b10: 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73  * outermost pars
1b20: 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76  er..**.** Not ev
1b30: 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74  erything is nest
1b40: 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69  able.  This faci
1b50: 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64  lity is designed
1b60: 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e   to permit.** IN
1b70: 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e  SERT, UPDATE, an
1b80: 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  d DELETE operati
1b90: 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49  ons against SQLI
1ba0: 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a  TE_MASTER.  Use.
1bb0: 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64  ** care if you d
1bc0: 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20  ecide to try to 
1bd0: 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
1be0: 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
1bf0: 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69  purposes..*/.voi
1c00: 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50  d sqlite3NestedP
1c10: 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  arse(Parse *pPar
1c20: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
1c30: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
1c40: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
1c50: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61  har *zSql;.  cha
1c60: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
1c70: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1c80: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65  pParse->db;.# de
1c90: 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73  fine SAVE_SZ  (s
1ca0: 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f  izeof(Parse) - o
1cb0: 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56  ffsetof(Parse,nV
1cc0: 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65  ar)).  char save
1cd0: 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20  Buf[SAVE_SZ];.. 
1ce0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1cf0: 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  r ) return;.  as
1d00: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65  sert( pParse->ne
1d10: 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e  sted<10 );  /* N
1d20: 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e  esting should on
1d30: 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64  ly be of limited
1d40: 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73   depth */.  va_s
1d50: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
1d60: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
1d70: 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20  te3VMPrintf(db, 
1d80: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
1d90: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
1da0: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
1db0: 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20   return;   /* A 
1dc0: 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  malloc must have
1dd0: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
1de0: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b   pParse->nested+
1df0: 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65  +;.  memcpy(save
1e00: 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56  Buf, &pParse->nV
1e10: 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20  ar, SAVE_SZ);.  
1e20: 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e  memset(&pParse->
1e30: 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a  nVar, 0, SAVE_SZ
1e40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50  );.  sqlite3RunP
1e50: 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53  arser(pParse, zS
1e60: 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ql, &zErrMsg);. 
1e70: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1e80: 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  b, zErrMsg);.  s
1e90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1ea0: 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79   zSql);.  memcpy
1eb0: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
1ec0: 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a  saveBuf, SAVE_SZ
1ed0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
1ee0: 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ted--;.}../*.** 
1ef0: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
1f00: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
1f10: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
1f20: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
1f30: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
1f40: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
1f50: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
1f60: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
1f70: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
1f80: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
1f90: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
1fa0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
1fb0: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
1fc0: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
1fd0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
1fe0: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
1ff0: 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68  the table and th
2000: 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68  e.** first match
2010: 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74  ing table is ret
2020: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
2030: 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61  king for duplica
2040: 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  te table.** name
2050: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
2060: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
2070: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
2080: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
2090: 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61  .** auxiliary da
20a0: 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73  tabases added us
20b0: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
20c0: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  ommand..**.** Se
20d0: 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f  e also sqlite3Lo
20e0: 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a  cateTable()..*/.
20f0: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69  Table *sqlite3Fi
2100: 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  ndTable(sqlite3 
2110: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
2120: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
2130: 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a  ar *zDatabase){.
2140: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a    Table *p = 0;.
2150: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
2160: 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Name;.  assert( 
2170: 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 6e 4e  zName!=0 );.  nN
2180: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
2190: 6c 65 6e 28 64 62 2c 20 7a 4e 61 6d 65 29 20 2b  len(db, zName) +
21a0: 20 31 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54   1;.  for(i=OMIT
21b0: 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e  _TEMPDB; i<db->n
21c0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
21d0: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
21e0: 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72  1 : i;   /* Sear
21f0: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
2200: 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  AIN */.    if( z
2210: 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73  Database!=0 && s
2220: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
2230: 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62  atabase, db->aDb
2240: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
2250: 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73  tinue;.    p = s
2260: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
2270: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
2280: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61  ma->tblHash, zNa
2290: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
22a0: 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20  if( p ) break;. 
22b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
22c0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
22d0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
22e0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
22f0: 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c  ribes a particul
2300: 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ar database.** t
2310: 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e  able given the n
2320: 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c  ame of that tabl
2330: 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c  e and (optionall
2340: 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  y) the name of t
2350: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
2360: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
2370: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ble.  Return NUL
2380: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20  L if not found. 
2390: 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a   Also leave an.*
23a0: 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * error message 
23b0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
23c0: 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  sg..**.** The di
23d0: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
23e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
23f0: 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  d sqlite3FindTab
2400: 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  le() is that thi
2410: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61  s.** routine lea
2420: 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ves an error mes
2430: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
2440: 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a  zErrMsg where.**
2450: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
2460: 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f  e() does not..*/
2470: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
2480: 6f 63 61 74 65 54 61 62 6c 65 28 0a 20 20 50 61  ocateTable(.  Pa
2490: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
24a0: 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20       /* context 
24b0: 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65 70 6f  in which to repo
24c0: 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  rt errors */.  i
24d0: 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20  nt isView,      
24e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
24f0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 56   looking for a V
2500: 49 45 57 20 72 61 74 68 65 72 20 74 68 61 6e 20  IEW rather than 
2510: 61 20 54 41 42 4c 45 20 2a 2f 0a 20 20 63 6f 6e  a TABLE */.  con
2520: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
2530: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2540: 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
2550: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20  looking for */. 
2560: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2570: 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ase     /* Name 
2580: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
2590: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
25a0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
25b0: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
25c0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
25d0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
25e0: 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
25f0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
2600: 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
2610: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
2620: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
2630: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
2640: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
2650: 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
2660: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20  n 0;.  }..  p = 
2670: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2680: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
2690: 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69  me, zDbase);.  i
26a0: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63  f( p==0 ){.    c
26b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20  onst char *zMsg 
26c0: 3d 20 69 73 56 69 65 77 20 3f 20 22 6e 6f 20 73  = isView ? "no s
26d0: 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e 6f 20  uch view" : "no 
26e0: 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 20 20 20  such table";.   
26f0: 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20   if( zDbase ){. 
2700: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2710: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
2720: 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67 2c 20  : %s.%s", zMsg, 
2730: 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a  zDbase, zName);.
2740: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2750: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2760: 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73  (pParse, "%s: %s
2770: 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b  ", zMsg, zName);
2780: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
2790: 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
27a0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
27b0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   p;.}../*.** Loc
27c0: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
27d0: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
27e0: 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61   describes .** a
27f0: 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
2800: 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  x given the name
2810: 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a   of that index.*
2820: 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f  * and the name o
2830: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
2840: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
2850: 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72   index..** Retur
2860: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
2870: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
2880: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
2890: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
28a0: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
28b0: 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68  .** table and th
28c0: 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
28d0: 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e   index is return
28e0: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
28f0: 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61  g.** for duplica
2900: 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69  te index names i
2910: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
2920: 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a  arch order is.**
2930: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
2940: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
2950: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
2960: 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73  ases added.** us
2970: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
2980: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78  ommand..*/.Index
2990: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64   *sqlite3FindInd
29a0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
29b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
29c0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
29d0: 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  Db){.  Index *p 
29e0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
29f0: 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  int nName = sqli
2a00: 74 65 33 53 74 72 6c 65 6e 28 64 62 2c 20 7a 4e  te3Strlen(db, zN
2a10: 61 6d 65 29 2b 31 3b 0a 20 20 66 6f 72 28 69 3d  ame)+1;.  for(i=
2a20: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
2a30: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2a40: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
2a50: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
2a60: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
2a70: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63  e MAIN */.    Sc
2a80: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
2a90: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
2aa0: 6d 61 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20  ma;.    if( zDb 
2ab0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2ac0: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
2ad0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2ae0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
2af0: 20 70 53 63 68 65 6d 61 20 7c 7c 20 28 6a 3d 3d   pSchema || (j==
2b00: 31 20 26 26 20 21 64 62 2d 3e 61 44 62 5b 31 5d  1 && !db->aDb[1]
2b10: 2e 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28  .pBt) );.    if(
2b20: 20 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   pSchema ){.    
2b30: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
2b40: 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e  hFind(&pSchema->
2b50: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  idxHash, zName, 
2b60: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nName);.    }.  
2b70: 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b    if( p ) break;
2b80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
2b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69  .}../*.** Reclai
2ba0: 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65  m the memory use
2bb0: 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f  d by an index.*/
2bc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
2bd0: 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29  eIndex(Index *p)
2be0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
2bf0: 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 64 62 3b  = p->pTable->db;
2c00: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2c10: 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29  (db, p->zColAff)
2c20: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2c30: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
2c40: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
2c50: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
2c60: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
2c70: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
2c80: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
2c90: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
2ca0: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
2cb0: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
2cc0: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  base hash tables
2cd0: 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f   but.** it is no
2ce0: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
2cf0: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
2d00: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e  t indexes..** Un
2d10: 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65  linking from the
2d20: 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64   Table must be d
2d30: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
2d40: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
2d50: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2d60: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 49 6e  teDeleteIndex(In
2d70: 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78  dex *p){.  Index
2d80: 20 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e 73 74 20   *pOld;.  const 
2d90: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d  char *zName = p-
2da0: 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f 6c 64 20  >zName;..  pOld 
2db0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
2dc0: 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d  ert(&p->pSchema-
2dd0: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
2de0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
2df0: 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
2e00: 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d  pOld==0 || pOld=
2e10: 3d 70 20 29 3b 0a 20 20 66 72 65 65 49 6e 64 65  =p );.  freeInde
2e20: 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  x(p);.}../*.** F
2e30: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
2e40: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
2e50: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
2e60: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
2e70: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
2e80: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
2e90: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
2ea0: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
2eb0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
2ec0: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
2ed0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
2ee0: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
2ef0: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
2f00: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
2f10: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
2f20: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
2f30: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
2f40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
2f50: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
2f60: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e  Index;.  int len
2f70: 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 20  ;.  Hash *pHash 
2f80: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  = &db->aDb[iDb].
2f90: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
2fa0: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  ;..  len = sqlit
2fb0: 65 33 53 74 72 6c 65 6e 28 64 62 2c 20 7a 49 64  e3Strlen(db, zId
2fc0: 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78  xName);.  pIndex
2fd0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
2fe0: 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78  sert(pHash, zIdx
2ff0: 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c 20 30 29 3b  Name, len+1, 0);
3000: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
3010: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
3020: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d  >pTable->pIndex=
3030: 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20  =pIndex ){.     
3040: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
3050: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
3060: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
3070: 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
3080: 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  *p;.      for(p=
3090: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
30a0: 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d 3e  pIndex; p && p->
30b0: 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20 70  pNext!=pIndex; p
30c0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20  =p->pNext){}.   
30d0: 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70     if( p && p->p
30e0: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  Next==pIndex ){.
30f0: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
3100: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
3110: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3120: 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70 49      freeIndex(pI
3130: 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  ndex);.  }.  db-
3140: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
3150: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
3160: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61  }../*.** Erase a
3170: 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d  ll schema inform
3180: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 69  ation from the i
3190: 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
31a0: 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73 69 6e  bles of.** a sin
31b0: 67 6c 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  gle database.  T
31c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
31d0: 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61 69 6d  alled to reclaim
31e0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72   memory.** befor
31f0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  e the database c
3200: 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c  loses.  It is al
3210: 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67  so called during
3220: 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69   a rollback.** i
3230: 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63 68  f there were sch
3240: 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69  ema changes duri
3250: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
3260: 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73 63  on or if a.** sc
3270: 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73 6d  hema-cookie mism
3280: 61 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  atch occurs..**.
3290: 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68 65  ** If iDb<=0 the
32a0: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
32b0: 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62 6c  rnal schema tabl
32c0: 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  es for all datab
32d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49  ase.** files.  I
32e0: 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72 65  f iDb>=2 then re
32f0: 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
3300: 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79   schema for only
3310: 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66   the.** single f
3320: 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a  ile indicated..*
3330: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
3340: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
3350: 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  a(sqlite3 *db, i
3360: 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 69  nt iDb){.  int i
3370: 2c 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 69  , j;.  assert( i
3380: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
3390: 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69  >nDb );..  if( i
33a0: 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  Db==0 ){.    sql
33b0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
33c0: 6c 28 64 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  l(db);.  }.  for
33d0: 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44  (i=iDb; i<db->nD
33e0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20  b; i++){.    Db 
33f0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
3400: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
3410: 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
3420: 20 20 61 73 73 65 72 74 28 69 3d 3d 31 20 7c 7c    assert(i==1 ||
3430: 20 28 70 44 62 2d 3e 70 42 74 20 26 26 20 73 71   (pDb->pBt && sq
3440: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
3450: 75 74 65 78 28 70 44 62 2d 3e 70 42 74 29 29 29  utex(pDb->pBt)))
3460: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
3470: 63 68 65 6d 61 46 72 65 65 28 70 44 62 2d 3e 70  chemaFree(pDb->p
3480: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
3490: 20 20 20 69 66 28 20 69 44 62 3e 30 20 29 20 72     if( iDb>0 ) r
34a0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
34b0: 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20  ert( iDb==0 );. 
34c0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
34d0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
34e0: 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ges;.  sqlite3Bt
34f0: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
3500: 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72  ..  /* If one or
3510: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78   more of the aux
3520: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
3530: 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63  files has been c
3540: 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e  losed,.  ** then
3550: 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f   remove them fro
3560: 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  m the auxiliary 
3570: 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20  database list.  
3580: 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a  We take the.  **
3590: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
35a0: 64 6f 20 74 68 69 73 20 68 65 72 65 20 73 69 6e  do this here sin
35b0: 63 65 20 77 65 20 68 61 76 65 20 6a 75 73 74 20  ce we have just 
35c0: 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74  deleted all of t
35d0: 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68  he.  ** schema h
35e0: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
35f0: 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20  herefore do not 
3600: 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79  have to make any
3610: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
3620: 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61   any of those ta
3630: 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
3640: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
3650: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
3660: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
3670: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
3680: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a   pDb->pBt==0 ){.
3690: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
36a0: 41 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72 65  Aux && pDb->xFre
36b0: 65 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72 65  eAux ) pDb->xFre
36c0: 65 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29 3b  eAux(pDb->pAux);
36d0: 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75 78  .      pDb->pAux
36e0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
36f0: 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64    for(i=j=2; i<d
3700: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3710: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
3720: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
3730: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
3740: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
3750: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3760: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
3770: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
3780: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
3790: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
37a0: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
37b0: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
37c0: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
37d0: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
37e0: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
37f0: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
3800: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
3810: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
3820: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
3830: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
3840: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
3850: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
3860: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
3870: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
3880: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
3890: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
38a0: 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62  db->aDb);.    db
38b0: 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
38c0: 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tatic;.  }.}../*
38d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
38e0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
38f0: 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e  a commit occurs.
3900: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3910: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
3920: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
3930: 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  b){.  db->flags 
3940: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
3950: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
3960: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
3970: 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 61  umn names from a
3980: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2e 0a   table or view..
3990: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
39a0: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
39b0: 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61  Names(Table *pTa
39c0: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
39d0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
39e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
39f0: 54 61 62 6c 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Table->db;.  ass
3a00: 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29  ert( pTable!=0 )
3a10: 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20  ;.  if( (pCol = 
3a20: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30  pTable->aCol)!=0
3a30: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
3a40: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
3a50: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
3a60: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
3a70: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  ee(db, pCol->zNa
3a80: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
3a90: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
3aa0: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20   pCol->pDflt);. 
3ab0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
3ac0: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79  ee(db, pCol->zTy
3ad0: 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pe);.      sqlit
3ae0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
3af0: 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  l->zColl);.    }
3b00: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
3b10: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61  ee(db, pTable->a
3b20: 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 70 54 61 62  Col);.  }.  pTab
3b30: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
3b40: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
3b50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
3b60: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74  e the memory dat
3b70: 61 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73  a structures ass
3b80: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
3b90: 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e   given.** Table.
3ba0: 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65    No changes are
3bb0: 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79   made to disk by
3bc0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
3bd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3be0: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74  e just deletes t
3bf0: 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  he data structur
3c00: 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  e.  It does not 
3c10: 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61  unlink.** the ta
3c20: 62 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ble data structu
3c30: 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  re from the hash
3c40: 20 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65   table.  Nor doe
3c50: 73 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66  s it remove.** f
3c60: 6f 72 65 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d  oreign keys from
3c70: 20 74 68 65 20 73 71 6c 69 74 65 2e 61 46 4b 65   the sqlite.aFKe
3c80: 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42  y hash table.  B
3c90: 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72  ut it does destr
3ca0: 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72  oy.** memory str
3cb0: 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69  uctures of the i
3cc0: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
3cd0: 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74  gn keys associat
3ce0: 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
3cf0: 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
3d00: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
3d10: 65 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  e(Table *pTable)
3d20: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
3d30: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65  x, *pNext;.  FKe
3d40: 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74  y *pFKey, *pNext
3d50: 46 4b 65 79 3b 0a 20 20 73 71 6c 69 74 65 33 20  FKey;.  sqlite3 
3d60: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  *db;..  if( pTab
3d70: 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  le==0 ) return;.
3d80: 20 20 64 62 20 3d 20 70 54 61 62 6c 65 2d 3e 64    db = pTable->d
3d90: 62 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  b;..  /* Do not 
3da0: 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65  delete the table
3db0: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72   until the refer
3dc0: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
3dd0: 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 70 54  es zero. */.  pT
3de0: 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  able->nRef--;.  
3df0: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  if( pTable->nRef
3e00: 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
3e10: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
3e20: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20  pTable->nRef==0 
3e30: 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  );..  /* Delete 
3e40: 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f  all indices asso
3e50: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
3e60: 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f   table.  */.  fo
3e70: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
3e80: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
3e90: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
3ea0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
3eb0: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
3ec0: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
3ed0: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65  >pSchema==pTable
3ee0: 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
3ef0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64   sqliteDeleteInd
3f00: 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  ex(pIndex);.  }.
3f10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3f20: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
3f30: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
3f40: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73   foreign keys as
3f50: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
3f60: 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b  is table.  The k
3f70: 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  eys.  ** should 
3f80: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
3f90: 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  n unlinked from 
3fa0: 74 68 65 20 70 53 63 68 65 6d 61 2d 3e 61 46 4b  the pSchema->aFK
3fb0: 65 79 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20  ey hash table . 
3fc0: 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d   */.  for(pFKey=
3fd0: 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70  pTable->pFKey; p
3fe0: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78  FKey; pFKey=pNex
3ff0: 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78  tFKey){.    pNex
4000: 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70  tFKey = pFKey->p
4010: 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73  NextFrom;.    as
4020: 73 65 72 74 28 20 73 71 6c 69 74 65 33 48 61 73  sert( sqlite3Has
4030: 68 46 69 6e 64 28 26 70 54 61 62 6c 65 2d 3e 70  hFind(&pTable->p
4040: 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 0a 20  Schema->aFKey,. 
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
4070: 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b  >zTo, strlen(pFK
4080: 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b  ey->zTo)+1)!=pFK
4090: 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ey );.    sqlite
40a0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65  3DbFree(db, pFKe
40b0: 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  y);.  }.#endif..
40c0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
40d0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
40e0: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
40f0: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
4100: 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20  Names(pTable);. 
4110: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4120: 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  b, pTable->zName
4130: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
4140: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a  ee(db, pTable->z
4150: 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74  ColAff);.  sqlit
4160: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
4170: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
4180: 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ct);.#ifndef SQL
4190: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
41a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
41b0: 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  te(db, pTable->p
41c0: 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20  Check);.#endif. 
41d0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61   sqlite3VtabClea
41e0: 72 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c  r(pTable);.  sql
41f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4200: 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Table);.}../*.**
4210: 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65   Unlink the give
4220: 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  n table from the
4230: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
4240: 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a   the delete the.
4250: 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  ** table structu
4260: 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20  re with all its 
4270: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
4280: 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69  ign keys..*/.voi
4290: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
42a0: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  ndDeleteTable(sq
42b0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
42c0: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
42d0: 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62  zTabName){.  Tab
42e0: 6c 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a 70  le *p;.  FKey *p
42f0: 46 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20 2a  F1, *pF2;.  Db *
4300: 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
4310: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
4320: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
4330: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
4340: 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 26  sert( zTabName &
4350: 26 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29 3b  & zTabName[0] );
4360: 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
4370: 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71  b[iDb];.  p = sq
4380: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
4390: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
43a0: 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65  blHash, zTabName
43b0: 2c 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61 6d  , strlen(zTabNam
43c0: 65 29 2b 31 2c 30 29 3b 0a 20 20 69 66 28 20 70  e)+1,0);.  if( p
43d0: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
43e0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
43f0: 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46 31 3d  KEY.    for(pF1=
4400: 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b 20 70  p->pFKey; pF1; p
4410: 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f  F1=pF1->pNextFro
4420: 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  m){.      int nT
4430: 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d 3e  o = strlen(pF1->
4440: 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  zTo) + 1;.      
4450: 70 46 32 20 3d 20 73 71 6c 69 74 65 33 48 61 73  pF2 = sqlite3Has
4460: 68 46 69 6e 64 28 26 70 44 62 2d 3e 70 53 63 68  hFind(&pDb->pSch
4470: 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d  ema->aFKey, pF1-
4480: 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20  >zTo, nTo);.    
4490: 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29    if( pF2==pF1 )
44a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
44b0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
44c0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79  ->pSchema->aFKey
44d0: 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c  , pF1->zTo, nTo,
44e0: 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a   pF1->pNextTo);.
44f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4500: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32 20       while( pF2 
4510: 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21  && pF2->pNextTo!
4520: 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32 2d  =pF1 ){ pF2=pF2-
4530: 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20  >pNextTo; }.    
4540: 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20      if( pF2 ){. 
4550: 20 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70 4e           pF2->pN
4560: 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65  extTo = pF1->pNe
4570: 78 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xtTo;.        }.
4580: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
4590: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
45a0: 44 65 6c 65 74 65 54 61 62 6c 65 28 70 29 3b 0a  DeleteTable(p);.
45b0: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
45c0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
45d0: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
45e0: 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c  * Given a token,
45f0: 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   return a string
4600: 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
4610: 66 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  f the text of th
4620: 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74 68  at.** token with
4630: 20 61 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73 20   any quotations 
4640: 72 65 6d 6f 76 65 64 2e 20 20 53 70 61 63 65 20  removed.  Space 
4650: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
4660: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
4670: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
4680: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
4690: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
46a0: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
46b0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ** function..**.
46c0: 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66  ** Tokens are of
46d0: 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72  ten just pointer
46e0: 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  s into the origi
46f0: 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64  nal SQL text and
4700: 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c   so.** are not \
4710: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
4720: 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69  nd are not persi
4730: 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75  stent.  The retu
4740: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
4750: 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  s \000 terminate
4760: 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74  d and is persist
4770: 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ent..*/.char *sq
4780: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
4790: 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  en(sqlite3 *db, 
47a0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
47b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
47c0: 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
47d0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
47e0: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
47f0: 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70  har*)pName->z, p
4800: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  Name->n);.    sq
4810: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
4820: 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
4830: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d    zName = 0;.  }
4840: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
4850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
4860: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
4870: 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e   table stored in
4880: 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
4890: 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74   iDb for.** writ
48a0: 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69  ing. The table i
48b0: 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63  s opened using c
48c0: 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ursor 0..*/.void
48d0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
48e0: 65 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  erTable(Parse *p
48f0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
4900: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
4910: 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c  etVdbe(p);.  sql
4920: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ite3TableLock(p,
4930: 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f   iDb, MASTER_ROO
4940: 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42  T, 1, SCHEMA_TAB
4950: 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69  LE(iDb));.  sqli
4960: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4970: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
4980: 73 2c 20 30 2c 20 35 29 3b 2f 2a 20 73 71 6c 69  s, 0, 5);/* sqli
4990: 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35 20  te_master has 5 
49a0: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 73 71 6c  columns */.  sql
49b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
49c0: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
49d0: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
49e0: 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iDb);.}../*.** T
49f0: 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  he token *pName 
4a00: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
4a10: 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  e of a database 
4a20: 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f  (either "main" o
4a30: 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74  r.** "temp" or t
4a40: 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74  he name of an at
4a50: 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73  tached db). This
4a60: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
4a70: 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66   the.** index of
4a80: 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62   the named datab
4a90: 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  ase in db->aDb[]
4aa0: 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e  , or -1 if the n
4ab0: 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73  amed db .** does
4ac0: 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69   not exist..*/.i
4ad0: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62  nt sqlite3FindDb
4ae0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
4af0: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69  ken *pName){.  i
4b00: 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 2f 2a  nt i = -1;    /*
4b10: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
4b20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
4b30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4b40: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
4b50: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 44 62  the name */.  Db
4b60: 20 2a 70 44 62 3b 20 20 20 20 20 20 20 2f 2a 20   *pDb;       /* 
4b70: 41 20 64 61 74 61 62 61 73 65 20 77 68 6f 73 65  A database whose
4b80: 20 6e 61 6d 65 20 73 70 61 63 65 20 69 73 20 62   name space is b
4b90: 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 2a 2f  eing searched */
4ba0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
4bb0: 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65    /* Name we are
4bc0: 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a   searching for *
4bd0: 2f 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  /..  zName = sql
4be0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4bf0: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
4c00: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
4c10: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d   n = strlen(zNam
4c20: 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64  e);.    for(i=(d
4c30: 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26  b->nDb-1), pDb=&
4c40: 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30  db->aDb[i]; i>=0
4c50: 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20  ; i--, pDb--){. 
4c60: 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49 54 5f       if( (!OMIT_
4c70: 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20 29  TEMPDB || i!=1 )
4c80: 20 26 26 20 6e 3d 3d 73 74 72 6c 65 6e 28 70 44   && n==strlen(pD
4c90: 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20  b->zName) && .  
4ca0: 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74          0==sqlit
4cb0: 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a  e3StrICmp(pDb->z
4cc0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  Name, zName) ){.
4cd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4ce0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4cf0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4d00: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  b, zName);.  }. 
4d10: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
4d20: 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   The table or vi
4d30: 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61  ew or trigger na
4d40: 6d 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  me is passed to 
4d50: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
4d60: 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65   tokens.** pName
4d70: 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66  1 and pName2. If
4d80: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
4d90: 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  was fully qualif
4da0: 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ied, for example
4db0: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
4dc0: 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e  ABLE xxx.yyy (..
4dd0: 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20  .);.** .** Then 
4de0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
4df0: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
4e00: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
4e10: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a  other hand if.**
4e20: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
4e30: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
4e40: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a  lified, i.e.:.**
4e50: 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45  .** CREATE TABLE
4e60: 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a   yyy(...);.**.**
4e70: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
4e80: 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64  set to "yyy" and
4e90: 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a   pName2 is ""..*
4ea0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4eb0: 65 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e  e sets the *ppUn
4ec0: 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20  qual pointer to 
4ed0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b  point at the tok
4ee0: 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a  en (pName1 or.**
4ef0: 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74   pName2) that st
4f00: 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69  ores the unquali
4f10: 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e  fied table name.
4f20: 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74    The index of t
4f30: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22  he.** database "
4f40: 78 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64  xxx" is returned
4f50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4f60: 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50  TwoPartName(.  P
4f70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4f80: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
4f90: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
4fa0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
4fb0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
4fc0: 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20     /* The "xxx" 
4fd0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
4fe0: 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a  .yyy" or "xxx" *
4ff0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
5000: 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  2,      /* The "
5010: 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  yyy" in the name
5020: 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20   "xxx.yyy" */.  
5030: 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20  Token **pUnqual 
5040: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
5050: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a   unqualified obj
5060: 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f  ect name here */
5070: 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  .){.  int iDb;  
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5090: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
50a0: 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74  lding the object
50b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
50c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
50d0: 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26  .  if( pName2 &&
50e0: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a   pName2->n>0 ){.
50f0: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
5100: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
5110: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
5120: 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  me2;.    iDb = s
5130: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c  qlite3FindDb(db,
5140: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
5150: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20  ( iDb<0 ){.     
5160: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5170: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
5180: 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20  n database %T", 
5190: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70  pName1);.      p
51a0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
51b0: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
51c0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
51d0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
51e0: 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62  nit.iDb==0 || db
51f0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
5200: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
5210: 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71  t.iDb;.    *pUnq
5220: 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20  ual = pName1;.  
5230: 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a  }.  return iDb;.
5240: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5250: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
5260: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54   check if the UT
5270: 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  F-8 string zName
5280: 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75   is a legal.** u
5290: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
52a0: 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61  for a new schema
52b0: 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20   object (table, 
52c0: 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a  index, view or.*
52d0: 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20  * trigger). All 
52e0: 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20  names are legal 
52f0: 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61  except those tha
5300: 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  t begin with the
5310: 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69   string.** "sqli
5320: 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20  te_" (in upper, 
5330: 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63  lower or mixed c
5340: 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69  ase). This porti
5350: 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70  on of the namesp
5360: 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76  ace.** is reserv
5370: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
5380: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
5390: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
53a0: 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  me(Parse *pParse
53b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
53c0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ame){.  if( !pPa
53d0: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
53e0: 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  sy && pParse->ne
53f0: 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20  sted==0 .       
5400: 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64     && (pParse->d
5410: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
5420: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d  E_WriteSchema)==
5430: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30  0.          && 0
5440: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
5450: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
5460: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
5470: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5480: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
5490: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
54a0: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
54b0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
54c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
54d0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
54e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
54f0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
5500: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
5510: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
5520: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
5530: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
5540: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
5550: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
5560: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
5570: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
5580: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5590: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
55a0: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
55b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
55c0: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
55d0: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
55e0: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
55f0: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
5600: 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20  . The isTemp.** 
5610: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
5620: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
5630: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
5640: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
5650: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
5660: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
5670: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
5680: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
5690: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
56a0: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
56b0: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
56c0: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
56d0: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
56e0: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
56f0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
5700: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
5710: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
5720: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
5730: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
5740: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
5750: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
5760: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
5770: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
5780: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
5790: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
57a0: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
57b0: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
57c0: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
57d0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
57e0: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
57f0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
5800: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
5810: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
5820: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
5830: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
5840: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
5850: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
5860: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
5870: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
5880: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
5890: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
58a0: 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72  ,   /* First par
58b0: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
58c0: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
58d0: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
58e0: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
58f0: 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  nd part of the n
5900: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5910: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e   or view */.  in
5920: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
5930: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
5940: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
5950: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
5960: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5970: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
5980: 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61  /.  int isVirtua
5990: 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  l,   /* True if 
59a0: 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41  this is a VIRTUA
59b0: 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  L table */.  int
59c0: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a   noErr        /*
59d0: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
59e0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
59f0: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
5a00: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61  e *pTable;.  cha
5a10: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a  r *zName = 0; /*
5a20: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
5a30: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
5a40: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
5a50: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
5a60: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20   *v;.  int iDb; 
5a70: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5a80: 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72  ase number to cr
5a90: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  eate the table i
5aa0: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
5ab0: 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  ame;    /* Unqua
5ac0: 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
5ad0: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61  he table to crea
5ae0: 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  te */..  /* The 
5af0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
5b00: 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73 20  me to create is 
5b10: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
5b20: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
5b30: 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e  s.  ** pName1 an
5b40: 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65  d pName2. If the
5b50: 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20   table name was 
5b60: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
5b70: 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   for example:.  
5b80: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
5b90: 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e  ABLE xxx.yyy (..
5ba0: 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54  .);.  ** .  ** T
5bb0: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
5bc0: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
5bd0: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
5be0: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
5bf0: 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65  f.  ** the table
5c00: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
5c10: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
5c20: 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  e.:.  **.  ** CR
5c30: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
5c40: 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ..);.  **.  ** T
5c50: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
5c60: 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70  t to "yyy" and p
5c70: 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a  Name2 is ""..  *
5c80: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  *.  ** The call 
5c90: 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70  below sets the p
5ca0: 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  Name pointer to 
5cb0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b  point at the tok
5cc0: 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20  en (pName1 or.  
5cd0: 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20  ** pName2) that 
5ce0: 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61  stores the unqua
5cf0: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
5d00: 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20  e. The variable 
5d10: 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20  iDb is.  ** set 
5d20: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
5d30: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
5d40: 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  t the table or v
5d50: 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a  iew is to be.  *
5d60: 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20  * created in..  
5d70: 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  */.  iDb = sqlit
5d80: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
5d90: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
5da0: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
5db0: 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
5dc0: 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54  urn;.  if( !OMIT
5dd0: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
5de0: 70 20 26 26 20 69 44 62 3e 31 20 29 7b 0a 20 20  p && iDb>1 ){.  
5df0: 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
5e00: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74   a temp table, t
5e10: 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20  he name may not 
5e20: 62 65 20 71 75 61 6c 69 66 69 65 64 20 2a 2f 0a  be qualified */.
5e30: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5e40: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d  Msg(pParse, "tem
5e50: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d  porary table nam
5e60: 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c  e must be unqual
5e70: 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65 74  ified");.    ret
5e80: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  urn;.  }.  if( !
5e90: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
5ea0: 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b  sTemp ) iDb = 1;
5eb0: 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  ..  pParse->sNam
5ec0: 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b  eToken = *pName;
5ed0: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
5ee0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
5ef0: 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
5f00: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
5f10: 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  urn;.  if( SQLIT
5f20: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
5f30: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
5f40: 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
5f50: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
5f60: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
5f70: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44   if( db->init.iD
5f80: 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20  b==1 ) isTemp = 
5f90: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
5fa0: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
5fb0: 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28  TION.  assert( (
5fc0: 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54  isTemp & 1)==isT
5fd0: 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69  emp );.  {.    i
5fe0: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61  nt code;.    cha
5ff0: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
6000: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
6010: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
6020: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
6030: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
6040: 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70  EMA_TABLE(isTemp
6050: 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
6060: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6070: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
6080: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
6090: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f   ){.      if( !O
60a0: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
60b0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
60c0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
60d0: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  EATE_TEMP_VIEW;.
60e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
60f0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
6100: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a  TE_CREATE_VIEW;.
6110: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
6120: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e{.      if( !OM
6130: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
6140: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  emp ){.        c
6150: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
6160: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ATE_TEMP_TABLE;.
6170: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6180: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
6190: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b  TE_CREATE_TABLE;
61a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
61b0: 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75 61     if( !isVirtua
61c0: 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74 68  l && sqlite3Auth
61d0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
61e0: 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  de, zName, 0, zD
61f0: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
6200: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
6210: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  or;.    }.  }.#e
6220: 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
6230: 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62  sure the new tab
6240: 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74  le name does not
6250: 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e   collide with an
6260: 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69   existing.  ** i
6270: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61  ndex or table na
6280: 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  me in the same d
6290: 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20  atabase.  Issue 
62a0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
62b0: 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73   if.  ** it does
62c0: 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  . The exception 
62d0: 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  is if the statem
62e0: 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65 64  ent being parsed
62f0: 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a   was passed.  **
6300: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64   to an sqlite3_d
6310: 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61  eclare_vtab() ca
6320: 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ll. In that case
6330: 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   only the column
6340: 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20   names.  ** and 
6350: 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73  types will be us
6360: 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ed, so there is 
6370: 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20  no need to test 
6380: 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20  for namespace.  
6390: 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20  ** collisions.. 
63a0: 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45   */.  if( !IN_DE
63b0: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
63c0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
63d0: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
63e0: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
63f0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6400: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
6410: 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73  }.    pTable = s
6420: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
6430: 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61  db, zName, db->a
6440: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a  Db[iDb].zName);.
6450: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29      if( pTable )
6460: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45  {.      if( !noE
6470: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rr ){.        sq
6480: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6490: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20  arse, "table %T 
64a0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
64b0: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   pName);.      }
64c0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
64d0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
64e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
64f0: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
6500: 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 26  , zName, 0)!=0 &
6510: 26 20 28 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62  & (iDb==0 || !db
6520: 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a  ->init.busy) ){.
6530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
6540: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
6550: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
6560: 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25  an index named %
6570: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
6580: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
6590: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
65a0: 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20    }..  pTable = 
65b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
65c0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
65d0: 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54  able));.  if( pT
65e0: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 64  able==0 ){.    d
65f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6600: 3d 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  = 1;.    pParse-
6610: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
6620: 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  EM;.    pParse->
6630: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
6640: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
6650: 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  or;.  }.  pTable
6660: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
6670: 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79  .  pTable->iPKey
6680: 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d   = -1;.  pTable-
6690: 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  >pSchema = db->a
66a0: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
66b0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 20  .  pTable->nRef 
66c0: 3d 20 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 64  = 1;.  pTable->d
66d0: 62 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 70 50  b = db;.  if( pP
66e0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
66f0: 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54  ) sqlite3DeleteT
6700: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 4e 65  able(pParse->pNe
6710: 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73  wTable);.  pPars
6720: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70  e->pNewTable = p
6730: 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Table;..  /* If 
6740: 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 67 69  this is the magi
6750: 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  c sqlite_sequenc
6760: 65 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20  e table used by 
6770: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20  autoincrement,. 
6780: 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20   ** then record 
6790: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  a pointer to thi
67a0: 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d  s table in the m
67b0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
67c0: 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74  ucture.  ** so t
67d0: 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66  hat INSERT can f
67e0: 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65 61  ind the table ea
67f0: 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  sily..  */.#ifnd
6800: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
6810: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69  UTOINCREMENT.  i
6820: 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74  f( !pParse->nest
6830: 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61  ed && strcmp(zNa
6840: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75  me, "sqlite_sequ
6850: 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ence")==0 ){.   
6860: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
6870: 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62  ->pSeqTab = pTab
6880: 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
6890: 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
68a0: 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74  ating the code t
68b0: 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20  hat will insert 
68c0: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
68d0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53   into.  ** the S
68e0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
68f0: 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72  le.  Note in par
6900: 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20  ticular that we 
6910: 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20  must go ahead.  
6920: 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  ** and allocate 
6930: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
6940: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
6950: 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f  entry now.  Befo
6960: 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d  re any.  ** PRIM
6970: 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
6980: 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70  E keywords are p
6990: 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65  arsed.  Those ke
69a0: 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73  ywords will caus
69b0: 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74  e.  ** indices t
69c0: 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64  o be created and
69d0: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
69e0: 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f  d must come befo
69f0: 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64  re the .  ** ind
6a00: 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ices.  Hence, th
6a10: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
6a20: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75  for the table mu
6a30: 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
6a40: 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20    ** now..  */. 
6a50: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
6a60: 75 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69  usy && (v = sqli
6a70: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
6a80: 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  e))!=0 ){.    in
6a90: 74 20 6a 31 3b 0a 20 20 20 20 69 6e 74 20 66 69  t j1;.    int fi
6aa0: 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e  leFormat;.    in
6ab0: 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65  t reg1, reg2, re
6ac0: 67 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  g3;.    sqlite3B
6ad0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
6ae0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
6af0: 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
6b00: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6b10: 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73  TABLE.    if( is
6b20: 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20  Virtual ){.     
6b30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6b40: 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29  p0(v, OP_VBegin)
6b50: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
6b60: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
6b70: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e  le format and en
6b80: 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61  coding in the da
6b90: 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20  tabase have not 
6ba0: 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a  been set, .    *
6bb0: 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a  * set them now..
6bc0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20      */.    reg1 
6bd0: 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77  = pParse->regRow
6be0: 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  id = ++pParse->n
6bf0: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20  Mem;.    reg2 = 
6c00: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20  pParse->regRoot 
6c10: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
6c20: 3b 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70  ;.    reg3 = ++p
6c30: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
6c40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6c50: 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f  p3(v, OP_ReadCoo
6c60: 6b 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20  kie, iDb, reg3, 
6c70: 31 29 3b 20 20 20 2f 2a 20 66 69 6c 65 5f 66 6f  1);   /* file_fo
6c80: 72 6d 61 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69  rmat */.    sqli
6c90: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
6ca0: 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 6a 31  (v, iDb);.    j1
6cb0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
6cc0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp1(v, OP_If, r
6cd0: 65 67 33 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f  eg3);.    fileFo
6ce0: 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67  rmat = (db->flag
6cf0: 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63  s & SQLITE_Legac
6d00: 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20  yFileFmt)!=0 ?. 
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d20: 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f   1 : SQLITE_MAX_
6d30: 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20  FILE_FORMAT;.   
6d40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6d50: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
6d60: 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c 20 72 65  , fileFormat, re
6d70: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
6d80: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6d90: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
6da0: 20 31 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73   1, reg3);.    s
6db0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6dc0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
6dd0: 45 4e 43 28 64 62 29 2c 20 72 65 67 33 29 3b 0a  ENC(db), reg3);.
6de0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6df0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
6e00: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 34 2c 20 72  ookie, iDb, 4, r
6e10: 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg3);.    sqlite
6e20: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
6e30: 20 6a 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68   j1);..    /* Th
6e40: 69 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20  is just creates 
6e50: 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72  a place-holder r
6e60: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c  ecord in the sql
6e70: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
6e80: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  ..    ** The rec
6e90: 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73  ord created does
6ea0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79   not contain any
6eb0: 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77  thing yet.  It w
6ec0: 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a  ill be replaced.
6ed0: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65      ** by the re
6ee0: 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65  al entry in code
6ef0: 20 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71   generated at sq
6f00: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e  lite3EndTable().
6f10: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
6f20: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
6f30: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65   new entry is le
6f40: 66 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  ft on the top of
6f50: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
6f60: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 76 61 6c  ** The rowid val
6f70: 75 65 20 69 73 20 6e 65 65 64 65 64 20 62 79 20  ue is needed by 
6f80: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  the code that sq
6f90: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69  lite3EndTable wi
6fa0: 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61  ll.    ** genera
6fb0: 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21  te..    */.#if !
6fc0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6fd0: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
6fe0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6ff0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
7000: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c      if( isView |
7010: 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  | isVirtual ){. 
7020: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7030: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
7040: 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a  eger, 0, reg2);.
7050: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
7060: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c  .    {.      sql
7070: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7080: 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  , OP_CreateTable
7090: 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20  , iDb, reg2);.  
70a0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
70b0: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70  penMasterTable(p
70c0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
70d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
70e0: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
70f0: 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20  d, 0, reg1);.   
7100: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7110: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
7120: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
7130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7140: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20  , OP_Insert, 0, 
7150: 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20  reg3, reg1);.   
7160: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7170: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
7180: 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69  PPEND);.    sqli
7190: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
71a0: 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a   OP_Close);.  }.
71b0: 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f  .  /* Normal (no
71c0: 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e  n-error) return.
71d0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20   */.  return;.. 
71e0: 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
71f0: 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20  occurs, we jump 
7200: 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61  here */.begin_ta
7210: 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c  ble_error:.  sql
7220: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
7230: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
7240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  .}../*.** This m
7250: 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20  acro is used to 
7260: 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69  compare two stri
7270: 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e  ngs in a case-in
7280: 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72  sensitive manner
7290: 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68  ..** It is sligh
72a0: 74 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 20  tly faster than 
72b0: 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53  calling sqlite3S
72c0: 74 72 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c  trICmp() directl
72d0: 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63  y, but.** produc
72e0: 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a  es larger code..
72f0: 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54  **.** WARNING: T
7300: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74  his macro is not
7310: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
7320: 20 74 68 65 20 73 74 72 63 6d 70 28 29 20 66 61   the strcmp() fa
7330: 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75  mily. It.** retu
7340: 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20  rns true if the 
7350: 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20  two strings are 
7360: 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65  equal, otherwise
7370: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69   false..*/.#defi
7380: 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29  ne STRICMP(x, y)
7390: 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72   (\.sqlite3Upper
73a0: 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e  ToLower[*(unsign
73b0: 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d  ed char *)(x)]==
73c0: 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65     \.sqlite3Uppe
73d0: 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67  rToLower[*(unsig
73e0: 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20  ned char *)(y)] 
73f0: 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33      \.&& sqlite3
7400: 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79  StrICmp((x)+1,(y
7410: 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a  )+1)==0 )../*.**
7420: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
7430: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
7440: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
7450: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
7460: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
7470: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
7480: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
7490: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
74a0: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
74b0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
74c0: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
74d0: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
74e0: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
74f0: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
7500: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
7510: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
7520: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
7530: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7540: 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20  AddColumn(Parse 
7550: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
7560: 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  pName){.  Table 
7570: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
7580: 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e  har *z;.  Column
7590: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
75a0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
75b0: 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  db;.  if( (p = p
75c0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
75d0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  )==0 ) return;.#
75e0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
75f0: 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43  LUMN.  if( p->nC
7600: 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  ol+1>db->aLimit[
7610: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
7620: 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
7630: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7640: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
7650: 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d  lumns on %s", p-
7660: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
7670: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
7680: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d    z = sqlite3Nam
7690: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
76a0: 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  e->db, pName);. 
76b0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
76c0: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
76d0: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  <p->nCol; i++){.
76e0: 20 20 20 20 69 66 28 20 53 54 52 49 43 4d 50 28      if( STRICMP(
76f0: 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  z, p->aCol[i].zN
7700: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ame) ){.      sq
7710: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7720: 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
7730: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73   column name: %s
7740: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", z);.      sql
7750: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
7760: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
7770: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
7780: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
7790: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
77a0: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
77b0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
77c0: 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
77d0: 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c  p->aCol,(p->nCol
77e0: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43  +8)*sizeof(p->aC
77f0: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  ol[0]));.    if(
7800: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
7810: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7820: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65  db, z);.      re
7830: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
7840: 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a  p->aCol = aNew;.
7850: 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d    }.  pCol = &p-
7860: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a  >aCol[p->nCol];.
7870: 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30    memset(pCol, 0
7880: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  , sizeof(p->aCol
7890: 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  [0]));.  pCol->z
78a0: 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a  Name = z;. .  /*
78b0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
78c0: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
78d0: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
78e0: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
78f0: 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49  y.  ** 'NONE'. I
7900: 66 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70  f there is a typ
7910: 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  e specified, the
7920: 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  n sqlite3AddColu
7930: 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20  mnType() will.  
7940: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78  ** be called nex
7950: 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61  t to set pCol->a
7960: 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c  ffinity correctl
7970: 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e  y..  */.  pCol->
7980: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
7990: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  E_AFF_NONE;.  p-
79a0: 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nCol++;.}../*.*
79b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
79c0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
79d0: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
79e0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
79f0: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
7a00: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
7a10: 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22  t.  A "NOT NULL"
7a20: 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a   constraint has.
7a30: 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20  ** been seen on 
7a40: 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20  a column.  This 
7a50: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
7a60: 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e   notNull flag on
7a70: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  .** the column c
7a80: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
7a90: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
7aa0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e  void sqlite3AddN
7ab0: 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  otNull(Parse *pP
7ac0: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
7ad0: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  r){.  Table *p;.
7ae0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28    int i;.  if( (
7af0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
7b00: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
7b10: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
7b20: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20  l-1;.  if( i>=0 
7b30: 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74  ) p->aCol[i].not
7b40: 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Null = onError;.
7b50: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  }../*.** Scan th
7b60: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61  e column type na
7b70: 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68  me zType (length
7b80: 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75   nType) and retu
7b90: 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69  rn the.** associ
7ba0: 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79  ated affinity ty
7bb0: 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  pe..**.** This r
7bc0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61  outine does a ca
7bd0: 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73  se-independent s
7be0: 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66  earch of zType f
7bf0: 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74  or the .** subst
7c00: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c  rings in the fol
7c10: 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66  lowing table. If
7c20: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73   one of the subs
7c30: 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75  trings is.** fou
7c40: 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  nd, the correspo
7c50: 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69  nding affinity i
7c60: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a  s returned. If z
7c70: 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  Type contains.**
7c80: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f   more than one o
7c90: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
7ca0: 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64  , entries toward
7cb0: 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20   the top of .** 
7cc0: 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70  the table take p
7cd0: 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61  riority. For exa
7ce0: 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69  mple, if zType i
7cf0: 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a  s 'BLOBINT', .**
7d00: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
7d10: 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e  GER is returned.
7d20: 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67  .**.** Substring
7d30: 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a       | Affinity.
7d40: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
7d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d60: 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20  ---.** 'INT'    
7d70: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7d80: 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48  F_INTEGER.** 'CH
7d90: 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  AR'        | SQL
7da0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
7db0: 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'CLOB'        | 
7dc0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
7dd0: 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20 20  ** 'TEXT'       
7de0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
7df0: 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20  XT.** 'BLOB'    
7e00: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7e10: 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20  _NONE.** 'REAL' 
7e20: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7e30: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f  AFF_REAL.** 'FLO
7e40: 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  A'        | SQLI
7e50: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
7e60: 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20 53  DOUB'        | S
7e70: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
7e80: 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20  *.** If none of 
7e90: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
7ea0: 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c  n the above tabl
7eb0: 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  e are found,.** 
7ec0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7ed0: 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  IC is returned..
7ee0: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41  */.char sqlite3A
7ef0: 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73  ffinityType(cons
7f00: 74 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b  t Token *pType){
7f10: 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20  .  u32 h = 0;.  
7f20: 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54  char aff = SQLIT
7f30: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
7f40: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7f50: 63 68 61 72 20 2a 7a 49 6e 20 3d 20 70 54 79 70  char *zIn = pTyp
7f60: 65 2d 3e 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  e->z;.  const un
7f70: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 6e  signed char *zEn
7f80: 64 20 3d 20 26 70 54 79 70 65 2d 3e 7a 5b 70 54  d = &pType->z[pT
7f90: 79 70 65 2d 3e 6e 5d 3b 0a 0a 20 20 77 68 69 6c  ype->n];..  whil
7fa0: 65 28 20 7a 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a  e( zIn!=zEnd ){.
7fb0: 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b      h = (h<<8) +
7fc0: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
7fd0: 6f 77 65 72 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20  ower[*zIn];.    
7fe0: 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68  zIn++;.    if( h
7ff0: 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68  ==(('c'<<24)+('h
8000: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
8010: 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20  'r') ){         
8020: 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20      /* CHAR */. 
8030: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8040: 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20  E_AFF_TEXT; .   
8050: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
8060: 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'c'<<24)+('l'<<1
8070: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
8080: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f   ){       /* CLO
8090: 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  B */.      aff =
80a0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
80b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
80c0: 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27  h==(('t'<<24)+('
80d0: 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29  e'<<16)+('x'<<8)
80e0: 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'t') ){       /
80f0: 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20  * TEXT */.      
8100: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
8110: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
8120: 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32   if( h==(('b'<<2
8130: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
8140: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
8150: 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20      /* BLOB */. 
8160: 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d         && (aff==
8170: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8180: 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  IC || aff==SQLIT
8190: 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20  E_AFF_REAL) ){. 
81a0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
81b0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e  E_AFF_NONE;.#ifn
81c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
81d0: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
81e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
81f0: 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('r'<<24)+('e'<
8200: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c  <16)+('a'<<8)+'l
8210: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ')          /* R
8220: 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  EAL */.        &
8230: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
8240: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
8250: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8260: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
8270: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27  lse if( h==(('f'
8280: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
8290: 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20  ('o'<<8)+'a')   
82a0: 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a         /* FLOA *
82b0: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
82c0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
82d0: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
82e0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
82f0: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
8300: 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29  f( h==(('d'<<24)
8310: 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c  +('o'<<16)+('u'<
8320: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
8330: 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20    /* DOUB */.   
8340: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
8350: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
8360: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
8370: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
8380: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
8390: 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46   if( (h&0x00FFFF
83a0: 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b  FF)==(('i'<<16)+
83b0: 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('n'<<8)+'t') ){
83c0: 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20      /* INT */.  
83d0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
83e0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
83f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8400: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61  .  }..  return a
8410: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ff;.}../*.** Thi
8420: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8430: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
8440: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
8450: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
8460: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
8470: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
8480: 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20  he pFirst token 
8490: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
84a0: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71  token in the seq
84b0: 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20  uence of tokens 
84c0: 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
84d0: 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a  e type of the.**
84e0: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
84f0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
8500: 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73  tion.   pLast is
8510: 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a   the last token.
8520: 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  ** in the sequen
8530: 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e  ce.  Use this in
8540: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  formation to con
8550: 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a  struct a string.
8560: 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ** that contains
8570: 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66   the typename of
8580: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   the column and 
8590: 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e  store that strin
85a0: 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a  g.** in zType..*
85b0: 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  / .void sqlite3A
85c0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72  ddColumnType(Par
85d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
85e0: 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62  n *pType){.  Tab
85f0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
8600: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
8610: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
8620: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
8630: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
8640: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
8650: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
8660: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  ( i<0 ) return;.
8670: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
8680: 6c 5b 69 5d 3b 0a 20 20 64 62 20 3d 20 70 50 61  l[i];.  db = pPa
8690: 72 73 65 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74  rse->db;.  sqlit
86a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
86b0: 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 70 43 6f  l->zType);.  pCo
86c0: 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  l->zType = sqlit
86d0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
86e0: 64 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43  db, pType);.  pC
86f0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
8700: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
8710: 70 65 28 70 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a  pe(pType);.}../*
8720: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
8730: 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  on is the defaul
8740: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
8750: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
8760: 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  ded column.** of
8770: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
8780: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
8790: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44  ruction..**.** D
87a0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70  efault value exp
87b0: 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65  ressions must be
87c0: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73   constant.  Rais
87d0: 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69  e an exception i
87e0: 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74  f this.** is not
87f0: 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a   the case..**.**
8800: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8810: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
8820: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
8830: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
8840: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
8850: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
8860: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8870: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
8880: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8890: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
88a0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75  Table *p;.  Colu
88b0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  mn *pCol;.  sqli
88c0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
88d0: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d  ->db;.  if( (p =
88e0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
88f0: 6c 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43  le)!=0 ){.    pC
8900: 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70  ol = &(p->aCol[p
8910: 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20  ->nCol-1]);.    
8920: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
8930: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
8940: 74 69 6f 6e 28 70 45 78 70 72 29 20 29 7b 0a 20  tion(pExpr) ){. 
8950: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8960: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65  rMsg(pParse, "de
8970: 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63  fault value of c
8980: 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f  olumn [%s] is no
8990: 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20  t constant",.   
89a0: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61         pCol->zNa
89b0: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
89c0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 70        Expr *pCop
89d0: 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  y;.      sqlite3
89e0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
89f0: 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20  Col->pDflt);.   
8a00: 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d     pCol->pDflt =
8a10: 20 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33   pCopy = sqlite3
8a20: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
8a30: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  r);.      if( pC
8a40: 6f 70 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  opy ){.        s
8a50: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
8a60: 64 62 2c 20 26 70 43 6f 70 79 2d 3e 73 70 61 6e  db, &pCopy->span
8a70: 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b  , &pExpr->span);
8a80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8a90: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
8aa0: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
8ab0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69  );.}../*.** Desi
8ac0: 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  gnate the PRIMAR
8ad0: 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61  Y KEY for the ta
8ae0: 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61  ble.  pList is a
8af0: 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a   list of names .
8b00: 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  ** of columns th
8b10: 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d  at form the prim
8b20: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69  ary key.  If pLi
8b30: 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  st is NULL, then
8b40: 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
8b50: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
8b60: 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  mn of the table 
8b70: 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  is the primary k
8b80: 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c  ey..**.** A tabl
8b90: 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f  e can have at mo
8ba0: 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  st one primary k
8bb0: 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c  ey.  If the tabl
8bc0: 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a  e already has.**
8bd0: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28   a primary key (
8be0: 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
8bf0: 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b  second primary k
8c00: 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20  ey) then create 
8c10: 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  an.** error..**.
8c20: 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52  ** If the PRIMAR
8c30: 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69  Y KEY is on a si
8c40: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73  ngle column whos
8c50: 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e  e datatype is IN
8c60: 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77  TEGER,.** then w
8c70: 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73  e will try to us
8c80: 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73  e that column as
8c90: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74   the rowid.  Set
8ca0: 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79   the Table.iPKey
8cb0: 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
8cc0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
8cd0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
8ce0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
8cf0: 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
8d00: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20  ARY KEY column. 
8d10: 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20   Table.iPKey is 
8d20: 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65  set to -1 if the
8d30: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45  re is.** no INTE
8d40: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
8d50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65  .**.** If the ke
8d60: 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  y is not an INTE
8d70: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
8d80: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75   then create a u
8d90: 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66  nique.** index f
8da0: 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20  or the key.  No 
8db0: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
8dc0: 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49   for INTEGER PRI
8dd0: 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f  MARY KEYs..*/.vo
8de0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69  id sqlite3AddPri
8df0: 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65  maryKey(.  Parse
8e00: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
8e10: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
8e20: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
8e30: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
8e40: 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f  f field names to
8e50: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
8e60: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
8e70: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
8e80: 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65   with a uniquene
8e90: 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ss conflict */. 
8ea0: 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20   int autoInc,   
8eb0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
8ec0: 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  e AUTOINCREMENT 
8ed0: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
8ee0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  nt */.  int sort
8ef0: 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c  Order     /* SQL
8f00: 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51  ITE_SO_ASC or SQ
8f10: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a  LITE_SO_DESC */.
8f20: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
8f30: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
8f40: 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54  able;.  char *zT
8f50: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ype = 0;.  int i
8f60: 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69  Col = -1, i;.  i
8f70: 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e  f( pTab==0 || IN
8f80: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
8f90: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
8fa0: 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61  _exit;.  if( pTa
8fb0: 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
8fc0: 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20 29  _HasPrimaryKey )
8fd0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8fe0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
8ff0: 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73       "table \"%s
9000: 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  \" has more than
9010: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
9020: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
9030: 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72  .    goto primar
9040: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a  y_key_exit;.  }.
9050: 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
9060: 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61 72   |= TF_HasPrimar
9070: 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69 73  yKey;.  if( pLis
9080: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
9090: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
90a0: 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  1;.    pTab->aCo
90b0: 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65  l[iCol].isPrimKe
90c0: 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 1;.  }else{.
90d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
90e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
90f0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f  ){.      for(iCo
9100: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
9110: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
9120: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
9130: 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
9140: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
9150: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
9160: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
9170: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9180: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9190: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61      if( iCol<pTa
91a0: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
91b0: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
91c0: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
91d0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
91e0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
91f0: 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d  nExpr>1 ) iCol =
9200: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   -1;.  }.  if( i
9210: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
9220: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
9230: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
9240: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
9250: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65  .  }.  if( zType
9260: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
9270: 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47  mp(zType, "INTEG
9280: 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ER")==0.        
9290: 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51  && sortOrder==SQ
92a0: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20  LITE_SO_ASC ){. 
92b0: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
92c0: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
92d0: 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72  >keyConf = onErr
92e0: 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  or;.    assert( 
92f0: 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75  autoInc==0 || au
9300: 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  toInc==1 );.    
9310: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
9320: 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74  = autoInc*TF_Aut
9330: 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 7d 65  oincrement;.  }e
9340: 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20  lse if( autoInc 
9350: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
9360: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
9370: 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33  MENT.    sqlite3
9380: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9390: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
93a0: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
93b0: 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22  on an ".       "
93c0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
93d0: 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  KEY");.#endif.  
93e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
93f0: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
9400: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
9410: 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30  List, onError, 0
9420: 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20  , 0, sortOrder, 
9430: 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  0);.    pList = 
9440: 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f  0;.  }..primary_
9450: 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  key_exit:.  sqli
9460: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
9470: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
9480: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ist);.  return;.
9490: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
94a0: 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ew CHECK constra
94b0: 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65  int to the table
94c0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
94d0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
94e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
94f0: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
9500: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9510: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
9520: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
9530: 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20  pr *pCheckExpr  
9540: 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70  /* The check exp
9550: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
9560: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9570: 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65  arse->db;.#ifnde
9580: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
9590: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
95a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
95b0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61  Table;.  if( pTa
95c0: 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45  b && !IN_DECLARE
95d0: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 2f 2a 20  _VTAB ){.    /* 
95e0: 54 68 65 20 43 48 45 43 4b 20 65 78 70 72 65 73  The CHECK expres
95f0: 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 64 75 70  sion must be dup
9600: 6c 69 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  licated so that 
9610: 74 6f 6b 65 6e 73 20 72 65 66 65 72 0a 20 20 20  tokens refer.   
9620: 20 2a 2a 20 74 6f 20 6d 61 6c 6c 6f 63 65 64 20   ** to malloced 
9630: 73 70 61 63 65 20 61 6e 64 20 6e 6f 74 20 74 68  space and not th
9640: 65 20 28 65 70 68 65 6d 65 72 61 6c 29 20 74 65  e (ephemeral) te
9650: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
9660: 20 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 73 74   TABLE.    ** st
9670: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 70  atement */.    p
9680: 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71  Tab->pCheck = sq
9690: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
96a0: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 0a   pTab->pCheck, .
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
96e0: 28 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29  (db, pCheckExpr)
96f0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
9700: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
9710: 65 28 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72  e(db, pCheckExpr
9720: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
9730: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
9740: 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nction of the mo
9750: 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73  st recently pars
9760: 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  ed table column.
9770: 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65  ** to the CollSe
9780: 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64  q given..*/.void
9790: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61   sqlite3AddColla
97a0: 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  teType(Parse *pP
97b0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  arse, Token *pTo
97c0: 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ken){.  Table *p
97d0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
97e0: 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
97f0: 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74         /* Dequot
9800: 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  ed name of colla
9810: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f  tion sequence */
9820: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
9830: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
9840: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
9850: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
9860: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64  = p->nCol-1;.  d
9870: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9880: 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
9890: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
98a0: 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  b, pToken);.  if
98b0: 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72  ( !zColl ) retur
98c0: 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  n;..  if( sqlite
98d0: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
98e0: 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31  Parse, zColl, -1
98f0: 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  ) ){.    Index *
9900: 70 49 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43 6f  pIdx;.    p->aCo
9910: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f  l[i].zColl = zCo
9920: 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66  ll;.  .    /* If
9930: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64   the column is d
9940: 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d  eclared as "<nam
9950: 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43  e> PRIMARY KEY C
9960: 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a  OLLATE <type>",.
9970: 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69      ** then an i
9980: 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65  ndex may have be
9990: 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68  en created on th
99a0: 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65  is column before
99b0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c   the.    ** coll
99c0: 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61  ation type was a
99d0: 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68  dded. Correct th
99e0: 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20  is if it is the 
99f0: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
9a00: 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e   for(pIdx=p->pIn
9a10: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
9a20: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
9a30: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
9a40: 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ->nColumn==1 );.
9a50: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
9a60: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29  aiColumn[0]==i )
9a70: 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  {.        pIdx->
9a80: 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61  azColl[0] = p->a
9a90: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[i].zColl;.  
9aa0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
9ab0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
9ac0: 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
9ad0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
9ae0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
9af0: 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74  turns the collat
9b00: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
9b10: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
9b20: 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e   text.** encodin
9b30: 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  g identified by 
9b40: 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  the string zName
9b50: 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a  , length nName..
9b60: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
9b70: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
9b80: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74   sequence is not
9b90: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e   available, or n
9ba0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  ot available.** 
9bb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
9bc0: 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c  native encoding,
9bd0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
9be0: 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65  actory is invoke
9bf0: 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20  d to.** request 
9c00: 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61  it. If the colla
9c10: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65  tion factory doe
9c20: 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63  s not supply suc
9c30: 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a  h a sequence,.**
9c40: 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63   and the sequenc
9c50: 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  e is available i
9c60: 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65  n another text e
9c70: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68  ncoding, then th
9c80: 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  at is.** returne
9c90: 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
9ca0: 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20   If no versions 
9cb0: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  of the requested
9cc0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75   collations sequ
9cd0: 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62  ence are availab
9ce0: 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65  le, or.** anothe
9cf0: 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  r error occurs, 
9d00: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
9d10: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65   and an error me
9d20: 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e  ssage written in
9d30: 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a  to.** pParse..**
9d40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9d50: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
9d60: 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64  ound sqlite3Find
9d70: 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73  CollSeq().  This
9d80: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f   routine.** invo
9d90: 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  kes the collatio
9da0: 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68 65  n factory if the
9db0: 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e   named collation
9dc0: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
9dd0: 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
9de0: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
9df0: 67 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  ge..*/.CollSeq *
9e00: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
9e10: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
9e20: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
9e30: 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65  zName, int nName
9e40: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
9e50: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
9e60: 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
9e70: 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  );.  u8 initbusy
9e80: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79   = db->init.busy
9e90: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
9ea0: 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73  ll;..  pColl = s
9eb0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
9ec0: 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65  q(db, enc, zName
9ed0: 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73  , nName, initbus
9ee0: 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62  y);.  if( !initb
9ef0: 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c  usy && (!pColl |
9f00: 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20  | !pColl->xCmp) 
9f10: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
9f20: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
9f30: 28 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d  (db, pColl, zNam
9f40: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69  e, nName);.    i
9f50: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
9f60: 20 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29     if( nName<0 )
9f70: 7b 0a 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20  {.        nName 
9f80: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 28  = sqlite3Strlen(
9f90: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
9fa0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
9fb0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9fc0: 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61  , "no such colla
9fd0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25  tion sequence: %
9fe0: 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61  .*s", nName, zNa
9ff0: 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  me);.      pColl
a000: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
a010: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
a020: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
a030: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
a040: 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  ll increment the
a050: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
a060: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  **.** The schema
a070: 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20   cookie is used 
a080: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
a090: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  n the schema for
a0a0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
a0b0: 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72   changes.  After
a0c0: 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61   each schema cha
a0d0: 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20  nge, the cookie 
a0e0: 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73  value.** changes
a0f0: 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73  .  When a proces
a100: 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68  s first reads th
a110: 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f  e schema it reco
a120: 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69  rds the.** cooki
a130: 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20  e.  Thereafter, 
a140: 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73  whenever it goes
a150: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
a160: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63  atabase,.** it c
a170: 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65  hecks the cookie
a180: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
a190: 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74  e schema has not
a1a0: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63   changed.** sinc
a1b0: 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65  e it was last re
a1c0: 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ad..**.** This p
a1d0: 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  lan is not compl
a1e0: 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f  etely bullet-pro
a1f0: 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  of.  It is possi
a200: 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ble for.** the s
a210: 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20  chema to change 
a220: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
a230: 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69  nd for the cooki
a240: 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62  e to be.** set b
a250: 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c  ack to prior val
a260: 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20  ue.  But schema 
a270: 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72  changes are infr
a280: 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  equent.** and th
a290: 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
a2a0: 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d   hitting the sam
a2b0: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69  e cookie value i
a2c0: 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e  s only.** 1 chan
a2d0: 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20  ce in 2^32.  So 
a2e0: 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67  we're safe enoug
a2f0: 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
a300: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50  e3ChangeCookie(P
a310: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
a320: 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 72 31  t iDb){.  int r1
a330: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
a340: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
a350: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
a360: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
a370: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
a380: 64 62 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dbe;.  sqlite3Vd
a390: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a3a0: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b  nteger, db->aDb[
a3b0: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63  iDb].pSchema->sc
a3c0: 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72  hema_cookie+1, r
a3d0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
a3e0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
a3f0: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 2c  tCookie, iDb, 0,
a400: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52   r1);.  sqlite3R
a410: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
a420: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
a430: 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20  .** Measure the 
a440: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
a450: 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f  ters needed to o
a460: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a  utput the given.
a470: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ** identifier.  
a480: 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  The number retur
a490: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79  ned includes any
a4a0: 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20   quotes used.** 
a4b0: 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  but does not inc
a4c0: 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65  lude the null te
a4d0: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  rminator..**.** 
a4e0: 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20  The estimate is 
a4f0: 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49  conservative.  I
a500: 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  t might be large
a510: 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a  r that what is.*
a520: 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e  * really needed.
a530: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
a540: 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74  dentLength(const
a550: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
a560: 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a   n;.  for(n=0; *
a570: 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20  z; n++, z++){.  
a580: 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b    if( *z=='"' ){
a590: 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65   n++; }.  }.  re
a5a0: 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f  turn n + 2;.}../
a5b0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64  *.** Write an id
a5c0: 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68  entifier onto th
a5d0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76  e end of the giv
a5e0: 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a  en string.  Add.
a5f0: 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  ** quote charact
a600: 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ers as needed..*
a610: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
a620: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
a630: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
a640: 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a  *zSignedIdent){.
a650: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a660: 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67  *zIdent = (unsig
a670: 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65  ned char*)zSigne
a680: 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c  dIdent;.  int i,
a690: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
a6a0: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f   i = *pIdx;.  fo
a6b0: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
a6c0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
a6d0: 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  !isalnum(zIdent[
a6e0: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
a6f0: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
a700: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
a710: 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c    zIdent[j]!=0 |
a720: 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74  | isdigit(zIdent
a730: 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  [0]).           
a740: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
a750: 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64  3KeywordCode(zId
a760: 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a  ent, j)!=TK_ID;.
a770: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
a780: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
a790: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
a7a0: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
a7b0: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
a7c0: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
a7d0: 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69  nt[j]=='"' ) z[i
a7e0: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20  ++] = '"';.  }. 
a7f0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
a800: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
a810: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
a820: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
a830: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
a840: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
a850: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
a860: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
a870: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
a880: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
a890: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
a8a0: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
a8b0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
a8c0: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
a8d0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
a8e0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
a8f0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
a900: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73  reateTableStmt(s
a910: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
a920: 65 20 2a 70 2c 20 69 6e 74 20 69 73 54 65 6d 70  e *p, int isTemp
a930: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e  ){.  int i, k, n
a940: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b  ;.  char *zStmt;
a950: 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a  .  char *zSep, *
a960: 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a  zSep2, *zEnd, *z
a970: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
a980: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72  ;.  n = 0;.  for
a990: 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c  (pCol = p->aCol,
a9a0: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
a9b0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
a9c0: 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e     n += identLen
a9d0: 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  gth(pCol->zName)
a9e0: 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e  ;.    z = pCol->
a9f0: 7a 54 79 70 65 3b 0a 20 20 20 20 69 66 28 20 7a  zType;.    if( z
aa00: 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28   ){.      n += (
aa10: 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31 29 3b 0a  strlen(z) + 1);.
aa20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d      }.  }.  n +=
aa30: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
aa40: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c  zName);.  if( n<
aa50: 35 30 20 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d  50 ){.    zSep =
aa60: 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d   "";.    zSep2 =
aa70: 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d   ",";.    zEnd =
aa80: 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   ")";.  }else{. 
aa90: 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22     zSep = "\n  "
aaa0: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
aab0: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20  \n  ";.    zEnd 
aac0: 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e  = "\n)";.  }.  n
aad0: 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43   += 35 + 6*p->nC
aae0: 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71  ol;.  zStmt = sq
aaf0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 20 29  lite3Malloc( n )
ab00: 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30  ;.  if( zStmt==0
ab10: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   ){.    db->mall
ab20: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
ab30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ab40: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
ab50: 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 0a 20 20 20  tf(n, zStmt,.   
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
ab70: 4f 4d 49 54 5f 54 45 4d 50 44 42 26 26 69 73 54  OMIT_TEMPDB&&isT
ab80: 65 6d 70 20 3f 20 22 43 52 45 41 54 45 20 54 45  emp ? "CREATE TE
ab90: 4d 50 20 54 41 42 4c 45 20 22 3a 22 43 52 45 41  MP TABLE ":"CREA
aba0: 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b  TE TABLE ");.  k
abb0: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29   = strlen(zStmt)
abc0: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
abd0: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
abe0: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
abf0: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f  = '(';.  for(pCo
ac00: 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  l=p->aCol, i=0; 
ac10: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
ac20: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  pCol++){.    sql
ac30: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
ac40: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  k, &zStmt[k], zS
ac50: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74  ep);.    k += st
ac60: 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b  rlen(&zStmt[k]);
ac70: 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70  .    zSep = zSep
ac80: 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28  2;.    identPut(
ac90: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d  zStmt, &k, pCol-
aca0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  >zName);.    if(
acb0: 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70   (z = pCol->zTyp
acc0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  e)!=0 ){.      z
acd0: 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b  Stmt[k++] = ' ';
ace0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
acf0: 74 72 6c 65 6e 28 7a 29 2b 6b 2b 31 3c 3d 6e 20  trlen(z)+k+1<=n 
ad00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ad10: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
ad20: 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20  zStmt[k], "%s", 
ad30: 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73  z);.      k += s
ad40: 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a  trlen(z);.    }.
ad50: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
ad60: 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74  printf(n-k, &zSt
ad70: 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e  mt[k], "%s", zEn
ad80: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74  d);.  return zSt
ad90: 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  mt;.}../*.** Thi
ada0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
adb0: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
adc0: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
add0: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
ade0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
adf0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
ae00: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
ae10: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
ae20: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
ae30: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
ae40: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
ae50: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
ae60: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
ae70: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
ae80: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
ae90: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
aea0: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
aeb0: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
aec0: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
aed0: 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20   unless.** this 
aee0: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
aef0: 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74  able or db->init
af00: 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20  .busy==1.  When 
af10: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
af20: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
af30: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
af40: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
af50: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
af60: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
af70: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
af80: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
af90: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
afa0: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
afb0: 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20  tly changed, so 
afc0: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
afd0: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
afe0: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
aff0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
b000: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
b010: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
b020: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
b030: 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
b040: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
b050: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
b060: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
b070: 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
b080: 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
b090: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
b0a0: 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
b0b0: 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
b0c0: 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
b0d0: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
b0e0: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
b0f0: 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
b100: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
b110: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
b120: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b130: 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73  EndTable(.  Pars
b140: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
b150: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
b160: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
b170: 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20  *pCons,         
b180: 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b    /* The ',' tok
b190: 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  en after the las
b1a0: 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a  t column defn. *
b1b0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
b1c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b1d0: 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b  he final ')' tok
b1e0: 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  en in the CREATE
b1f0: 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65   TABLE */.  Sele
b200: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
b210: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72      /* Select fr
b220: 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e  om a "CREATE ...
b230: 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29   AS SELECT" */.)
b240: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
b250: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
b260: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
b270: 69 44 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e  iDb;..  if( (pEn
b280: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
b290: 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  =0) || pParse->n
b2a0: 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
b2b0: 63 46 61 69 6c 65 64 20 29 20 7b 0a 20 20 20 20  cFailed ) {.    
b2c0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20  return;.  }.  p 
b2d0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
b2e0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
b2f0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
b300: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
b310: 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20  usy || !pSelect 
b320: 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  );..  iDb = sqli
b330: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
b340: 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
b350: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
b360: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f  E_OMIT_CHECK.  /
b370: 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20  * Resolve names 
b380: 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e  in all CHECK con
b390: 73 74 72 61 69 6e 74 20 65 78 70 72 65 73 73 69  straint expressi
b3a0: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
b3b0: 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20  p->pCheck ){.   
b3c0: 20 53 72 63 4c 69 73 74 20 73 53 72 63 3b 20 20   SrcList sSrc;  
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3e0: 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69 73 74   /* Fake SrcList
b3f0: 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65   for pParse->pNe
b400: 77 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4e 61  wTable */.    Na
b410: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b430: 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
b440: 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  r pParse->pNewTa
b450: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73  ble */..    mems
b460: 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
b470: 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 6d 65  of(sNC));.    me
b480: 6d 73 65 74 28 26 73 53 72 63 2c 20 30 2c 20 73  mset(&sSrc, 0, s
b490: 69 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a 20 20  izeof(sSrc));.  
b4a0: 20 20 73 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b    sSrc.nSrc = 1;
b4b0: 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a  .    sSrc.a[0].z
b4c0: 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b  Name = p->zName;
b4d0: 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70  .    sSrc.a[0].p
b4e0: 54 61 62 20 3d 20 70 3b 0a 20 20 20 20 73 53 72  Tab = p;.    sSr
b4f0: 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d  c.a[0].iCursor =
b500: 20 2d 31 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61   -1;.    sNC.pPa
b510: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
b520: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
b530: 20 26 73 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e   &sSrc;.    sNC.
b540: 69 73 43 68 65 63 6b 20 3d 20 31 3b 0a 20 20 20  isCheck = 1;.   
b550: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
b560: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e  lveExprNames(&sN
b570: 43 2c 20 70 2d 3e 70 43 68 65 63 6b 29 20 29 7b  C, p->pCheck) ){
b580: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
b590: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
b5a0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
b5b0: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a  TE_OMIT_CHECK) *
b5c0: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  /..  /* If the d
b5d0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
b5e0: 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  1 it means we ar
b5f0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51  e reading the SQ
b600: 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22  L off the.  ** "
b610: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f  sqlite_master" o
b620: 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  r "sqlite_temp_m
b630: 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20  aster" table on 
b640: 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53  the disk..  ** S
b650: 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  o do not write t
b660: 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e  o the disk again
b670: 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72  .  Extract the r
b680: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  oot page number.
b690: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62    ** for the tab
b6a0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e  le from the db->
b6b0: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65  init.newTnum fie
b6c0: 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e  ld.  (The page n
b6d0: 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c  umber.  ** shoul
b6e0: 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20  d have been put 
b6f0: 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c  there by the sql
b700: 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e  iteOpenCb routin
b710: 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  e.).  */.  if( d
b720: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
b730: 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62      p->tnum = db
b740: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a  ->init.newTnum;.
b750: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74    }..  /* If not
b760: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74   initializing, t
b770: 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63  hen create a rec
b780: 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ord for the new 
b790: 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68  table.  ** in th
b7a0: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
b7b0: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74  table of the dat
b7c0: 61 62 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f  abase.  The reco
b7d0: 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  rd number.  ** f
b7e0: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
b7f0: 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c   entry should al
b800: 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20  ready be on the 
b810: 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stack..  **.  **
b820: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45   If this is a TE
b830: 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77  MPORARY table, w
b840: 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69  rite the entry i
b850: 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72  nto the auxiliar
b860: 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74  y.  ** file inst
b870: 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20  ead of into the 
b880: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
b890: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  le..  */.  if( !
b8a0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
b8b0: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
b8c0: 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
b8d0: 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20  r *zType;    /* 
b8e0: 22 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65  "view" or "table
b8f0: 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  " */.    char *z
b900: 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45  Type2;   /* "VIE
b910: 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f  W" or "TABLE" */
b920: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  .    char *zStmt
b930: 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20  ;    /* Text of 
b940: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
b950: 20 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20   or CREATE VIEW 
b960: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20  statement */..  
b970: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
b980: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
b990: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
b9a0: 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  urn;..    sqlite
b9b0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
b9c0: 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20  P_Close, 0);..  
b9d0: 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
b9e0: 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65  rootpage for the
b9f0: 20 6e 65 77 20 74 61 62 6c 65 20 61 6e 64 20 70   new table and p
ba00: 75 73 68 20 69 74 20 6f 6e 74 6f 20 74 68 65 20  ush it onto the 
ba10: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 41 20  stack..    ** A 
ba20: 76 69 65 77 20 68 61 73 20 6e 6f 20 72 6f 6f 74  view has no root
ba30: 70 61 67 65 2c 20 73 6f 20 6a 75 73 74 20 70 75  page, so just pu
ba40: 73 68 20 61 20 7a 65 72 6f 20 6f 6e 74 6f 20 74  sh a zero onto t
ba50: 68 65 20 73 74 61 63 6b 20 66 6f 72 0a 20 20 20  he stack for.   
ba60: 20 2a 2a 20 76 69 65 77 73 2e 20 20 49 6e 69 74   ** views.  Init
ba70: 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 61 74 20  ialize zType at 
ba80: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20  the same time.. 
ba90: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
baa0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
bab0: 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61       /* A regula
bac0: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
bad0: 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22   zType = "table"
bae0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
baf0: 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65   "TABLE";.#ifnde
bb00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
bb10: 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  EW.    }else{.  
bb20: 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f      /* A view */
bb30: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
bb40: 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79  view";.      zTy
bb50: 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65  pe2 = "VIEW";.#e
bb60: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
bb70: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
bb80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20  CREATE TABLE xx 
bb90: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65  AS SELECT ..., e
bba0: 78 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43  xecute the SELEC
bbb0: 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  T.    ** stateme
bbc0: 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  nt to populate t
bbd0: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68  he new table. Th
bbe0: 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  e root-page numb
bbf0: 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  er for the.    *
bc00: 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6f  * new table is o
bc10: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
bc20: 20 76 64 62 65 20 73 74 61 63 6b 2e 0a 20 20 20   vdbe stack..   
bc30: 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20   **.    ** Once 
bc40: 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62  the SELECT has b
bc50: 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c  een coded by sql
bc60: 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74  ite3Select(), it
bc70: 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20   is in a.    ** 
bc80: 73 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74  suitable state t
bc90: 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20  o query for the 
bca0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
bcb0: 20 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65   types to be use
bcc0: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
bcd0: 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  new table..    *
bce0: 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65  *.    ** A share
bcf0: 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f  d-cache write-lo
bd00: 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ck is not requir
bd10: 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
bd20: 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20  he new table,.  
bd30: 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61    ** as a schema
bd40: 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20  -lock must have 
bd50: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74  already been obt
bd60: 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20  ained to create 
bd70: 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a  it. Since.    **
bd80: 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65   a schema-lock e
bd90: 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65  xcludes all othe
bda0: 72 20 64 61 74 61 62 61 73 65 20 75 73 65 72 73  r database users
bdb0: 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  , the write-lock
bdc0: 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65   would.    ** be
bdd0: 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20   redundant..    
bde0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  */.    if( pSele
bdf0: 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  ct ){.      Sele
be00: 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
be10: 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61     Table *pSelTa
be20: 62 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  b;..      assert
be30: 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 30  (pParse->nTab==0
be40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
be50: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
be60: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70  _OpenWrite, 1, p
be70: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20  Parse->regRoot, 
be80: 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
be90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
bea0: 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 50 61  v, 1);.      pPa
beb0: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20  rse->nTab = 2;. 
bec0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
bed0: 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
bee0: 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b  , SRT_Table, 1);
bef0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
bf00: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
bf10: 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20  lect, &dest);.  
bf20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bf30: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
bf40: 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 1);.      if(
bf50: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
bf60: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   ){.        pSel
bf70: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
bf80: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
bf90: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b  Parse, pSelect);
bfa0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
bfb0: 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
bfc0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
bfd0: 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
bfe0: 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20          p->nCol 
bff0: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
c000: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c  .        p->aCol
c010: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
c020: 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  ;.        pSelTa
c030: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
c040: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
c050: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
c060: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
c070: 6c 65 28 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  le(pSelTab);.   
c080: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
c090: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
c0a0: 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
c0b0: 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65  the CREATE state
c0c0: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  ment */.    if( 
c0d0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
c0e0: 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54   zStmt = createT
c0f0: 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 2c 20  ableStmt(db, p, 
c100: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  p->pSchema==db->
c110: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
c120: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c130: 20 20 6e 20 3d 20 70 45 6e 64 2d 3e 7a 20 2d 20    n = pEnd->z - 
c140: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
c150: 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20 20 20 20  en.z + 1;.      
c160: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
c170: 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20  Printf(db, .    
c180: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73        "CREATE %s
c190: 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20   %.*s", zType2, 
c1a0: 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  n, pParse->sName
c1b0: 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b  Token.z.      );
c1c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
c1d0: 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65   slot for the re
c1e0: 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79  cord has already
c1f0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
c200: 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53  in the .    ** S
c210: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
c220: 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65  le.  We just nee
c230: 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74  d to update that
c240: 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20   slot with all. 
c250: 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d     ** the inform
c260: 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c  ation we've coll
c270: 65 63 74 65 64 2e 20 20 54 68 65 20 72 6f 77 69  ected.  The rowi
c280: 64 20 66 6f 72 20 74 68 65 20 70 72 65 61 6c 6c  d for the preall
c290: 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c  ocated.    ** sl
c2a0: 6f 74 20 69 73 20 74 68 65 20 32 6e 64 20 69 74  ot is the 2nd it
c2b0: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
c2c0: 20 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65    The top of the
c2d0: 20 73 74 61 63 6b 20 69 73 20 74 68 65 0a 20 20   stack is the.  
c2e0: 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 66    ** root page f
c2f0: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
c300: 20 28 6f 72 20 61 20 30 20 69 66 20 74 68 69 73   (or a 0 if this
c310: 20 69 73 20 61 20 76 69 65 77 29 2e 0a 20 20 20   is a view)..   
c320: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
c330: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
c340: 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45  e,.      "UPDATE
c350: 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20   %Q.%s ".       
c360: 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27    "SET type='%s'
c370: 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e  , name=%Q, tbl_n
c380: 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65  ame=%Q, rootpage
c390: 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20  =#%d, sql=%Q ". 
c3a0: 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77        "WHERE row
c3b0: 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64  id=#%d",.      d
c3c0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
c3d0: 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
c3e0: 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70  iDb),.      zTyp
c3f0: 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
c400: 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
c410: 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  e,.      pParse-
c420: 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20  >regRoot,.      
c430: 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61  zStmt,.      pPa
c440: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20  rse->regRowid.  
c450: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
c460: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
c470: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
c480: 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
c490: 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  e, iDb);..#ifnde
c4a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
c4b0: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
c4c0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
c4d0: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  if we need to cr
c4e0: 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73  eate an sqlite_s
c4f0: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f  equence table fo
c500: 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67  r.    ** keeping
c510: 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e   track of autoin
c520: 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20  crement keys..  
c530: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
c540: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
c550: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20  toincrement ){. 
c560: 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26       Db *pDb = &
c570: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
c580: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63      if( pDb->pSc
c590: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30  hema->pSeqTab==0
c5a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c5b0: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
c5c0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
c5d0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
c5e0: 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
c5f0: 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20  e(name,seq)",.  
c600: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
c610: 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
c620: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
c630: 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72  if..    /* Repar
c640: 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f  se everything to
c650: 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
c660: 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
c670: 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ures */.    sqli
c680: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
c690: 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c   OP_ParseSchema,
c6a0: 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20 20 20 20   iDb, 0, 0,.    
c6b0: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
c6c0: 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65  tf(db, "tbl_name
c6d0: 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29  ='%q'",p->zName)
c6e0: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
c6f0: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68   }...  /* Add th
c700: 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
c710: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
c720: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
c730: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
c740: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
c750: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  y && pParse->nEr
c760: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c  r==0 ){.    Tabl
c770: 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65  e *pOld;.    FKe
c780: 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 53  y *pFKey; .    S
c790: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
c7a0: 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20   p->pSchema;.   
c7b0: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
c7c0: 61 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65  ashInsert(&pSche
c7d0: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e  ma->tblHash, p->
c7e0: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d  zName, strlen(p-
c7f0: 3e 7a 4e 61 6d 65 29 2b 31 2c 70 29 3b 0a 20 20  >zName)+1,p);.  
c800: 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
c810: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
c820: 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  Old );  /* Mallo
c830: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
c840: 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e  ed inside HashIn
c850: 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  sert() */.      
c860: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c870: 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
c880: 72 6e 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  rn;.    }.#ifnde
c890: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
c8a0: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f  REIGN_KEY.    fo
c8b0: 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79  r(pFKey=p->pFKey
c8c0: 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70  ; pFKey; pFKey=p
c8d0: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29  FKey->pNextFrom)
c8e0: 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 64 61  {.      void *da
c8f0: 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  ta;.      int nT
c900: 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65 79  o = strlen(pFKey
c910: 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20  ->zTo) + 1;.    
c920: 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
c930: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
c940: 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b  nd(&pSchema->aFK
c950: 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  ey, pFKey->zTo, 
c960: 6e 54 6f 29 3b 0a 20 20 20 20 20 20 64 61 74 61  nTo);.      data
c970: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
c980: 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 61  sert(&pSchema->a
c990: 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f  FKey, pFKey->zTo
c9a0: 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20  , nTo, pFKey);. 
c9b0: 20 20 20 20 20 69 66 28 20 64 61 74 61 3d 3d 28       if( data==(
c9c0: 76 6f 69 64 20 2a 29 70 46 4b 65 79 20 29 7b 0a  void *)pFKey ){.
c9d0: 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c          db->mall
c9e0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
c9f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
ca00: 69 66 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  if.    pParse->p
ca10: 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  NewTable = 0;.  
ca20: 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a    db->nTable++;.
ca30: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
ca40: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
ca50: 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  anges;..#ifndef 
ca60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45  SQLITE_OMIT_ALTE
ca70: 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21  RTABLE.    if( !
ca80: 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  p->pSelect ){.  
ca90: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
caa0: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
cab0: 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e  har *)pParse->sN
cac0: 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20  ameToken.z;.    
cad0: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20    int nName;.   
cae0: 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65 6c     assert( !pSel
caf0: 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20  ect && pCons && 
cb00: 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66  pEnd );.      if
cb10: 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b  ( pCons->z==0 ){
cb20: 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d  .        pCons =
cb30: 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20   pEnd;.      }. 
cb40: 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 63 6f       nName = (co
cb50: 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73  nst char *)pCons
cb60: 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ->z - zName;.   
cb70: 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73     p->addColOffs
cb80: 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65  et = 13 + sqlite
cb90: 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61  3Utf8CharLen(zNa
cba0: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
cbb0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
cbc0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cbd0: 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54  MIT_VIEW./*.** T
cbe0: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
cbf0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20  this routine in 
cc00: 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20  order to create 
cc10: 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f  a new VIEW.*/.vo
cc20: 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
cc30: 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  View(.  Parse *p
cc40: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
cc50: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
cc60: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42  t */.  Token *pB
cc70: 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65  egin,     /* The
cc80: 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
cc90: 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74  at begins the st
cca0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
ccb0: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
ccc0: 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
ccd0: 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
cce0: 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
ccf0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
cd00: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
cd10: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
cd20: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
cd30: 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  w */.  Select *p
cd40: 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53  Select,   /* A S
cd50: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
cd60: 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
cd70: 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f   the new view */
cd80: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
cd90: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f        /* TRUE fo
cda0: 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69  r a TEMPORARY vi
cdb0: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72  ew */.  int noEr
cdc0: 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  r          /* Su
cdd0: 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73  ppress error mes
cde0: 73 61 67 65 73 20 69 66 20 56 49 45 57 20 61 6c  sages if VIEW al
cdf0: 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
ce00: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
ce10: 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20   int n;.  const 
ce20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
ce30: 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
ce40: 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
ce50: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a    Token *pName;.
ce60: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c    int iDb;.  sql
ce70: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
ce80: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
ce90: 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a  arse->nVar>0 ){.
cea0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ceb0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72  Msg(pParse, "par
cec0: 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20  ameters are not 
ced0: 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73  allowed in views
cee0: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ");.    sqlite3S
cef0: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
cf00: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
cf10: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
cf20: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
cf30: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
cf40: 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c  ame2, isTemp, 1,
cf50: 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20   0, noErr);.  p 
cf60: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
cf70: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
cf80: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
cf90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
cfa0: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
cfb0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
cfc0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
cfd0: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
cfe0: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
cff0: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
d000: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
d010: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
d020: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69  p->pSchema);.  i
d030: 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
d040: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
d050: 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e   iDb, "view", pN
d060: 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69  ame).    && sqli
d070: 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
d080: 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29  ix, pSelect).  )
d090: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
d0a0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
d0b0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
d0c0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rn;.  }..  /* Ma
d0d0: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
d0e0: 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
d0f0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
d100: 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
d110: 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
d120: 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
d130: 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
d140: 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
d150: 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
d160: 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
d170: 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
d180: 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
d190: 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
d1a0: 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
d1b0: 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
d1c0: 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
d1d0: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
d1e0: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65  .  */.  p->pSele
d1f0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
d200: 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63  ctDup(db, pSelec
d210: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  t);.  sqlite3Sel
d220: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
d230: 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62  elect);.  if( db
d240: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
d250: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
d260: 7d 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  }.  if( !db->ini
d270: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71  t.busy ){.    sq
d280: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
d290: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
d2a0: 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  p);.  }..  /* Lo
d2b0: 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  cate the end of 
d2c0: 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20  the CREATE VIEW 
d2d0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65  statement.  Make
d2e0: 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20   sEnd point to. 
d2f0: 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a   ** the end..  *
d300: 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  /.  sEnd = pPars
d310: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
d320: 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d   if( sEnd.z[0]!=
d330: 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d  0 && sEnd.z[0]!=
d340: 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
d350: 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
d360: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
d370: 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42   n = sEnd.z - pB
d380: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28  egin->z;.  z = (
d390: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
d3a0: 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a  har*)pBegin->z;.
d3b0: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
d3c0: 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20  (z[n-1]==';' || 
d3d0: 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29  isspace(z[n-1]))
d3e0: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e   ){ n--; }.  sEn
d3f0: 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20  d.z = &z[n-1];. 
d400: 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20   sEnd.n = 1;..  
d410: 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e  /* Use sqlite3En
d420: 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20  dTable() to add 
d430: 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20  the view to the 
d440: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
d450: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
d460: 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
d470: 20 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20   0, &sEnd, 0);. 
d480: 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
d490: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
d4a0: 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64  _VIEW */..#if !d
d4b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
d4c0: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
d4d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
d4e0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f  _VIRTUALTABLE)./
d4f0: 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
d500: 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20  tructure pTable 
d510: 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57  is really a VIEW
d520: 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e  .  Fill in the n
d530: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63  ames of.** the c
d540: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69  olumns of the vi
d550: 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65  ew in the pTable
d560: 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74   structure.  Ret
d570: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a  urn the number.*
d580: 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  * of errors.  If
d590: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
d5a0: 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  n leave an error
d5b0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
d5c0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  se->zErrMsg..*/.
d5d0: 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77 47  int sqlite3ViewG
d5e0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61  etColumnNames(Pa
d5f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
d600: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54  le *pTable){.  T
d610: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20  able *pSelTab;  
d620: 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65   /* A fake table
d630: 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67   from which we g
d640: 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  et the result se
d650: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
d660: 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79  Sel;     /* Copy
d670: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 74   of the SELECT t
d680: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
d690: 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  he view */.  int
d6a0: 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f   nErr = 0;     /
d6b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  * Number of erro
d6c0: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a  rs encountered *
d6d0: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
d6e0: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
d6f0: 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e  rily holds the n
d700: 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
d710: 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73   assigned */.  s
d720: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
d730: 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
d740: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
d750: 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f   for malloc erro
d760: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 41  rs */.  int (*xA
d770: 75 74 68 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  uth)(void*,int,c
d780: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
d790: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
d7a0: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  r*,const char*);
d7b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
d7c0: 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  le );..#ifndef S
d7d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
d7e0: 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 73 71  ALTABLE.  if( sq
d7f0: 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e  lite3VtabCallCon
d800: 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61  nect(pParse, pTa
d810: 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ble) ){.    retu
d820: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
d830: 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72  .  }.  if( IsVir
d840: 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72  tual(pTable) ) r
d850: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
d860: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d870: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41  OMIT_VIEW.  /* A
d880: 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d   positive nCol m
d890: 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73  eans the columns
d8a0: 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
d8b0: 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c  view are.  ** al
d8c0: 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a  ready known..  *
d8d0: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
d8e0: 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20  nCol>0 ) return 
d8f0: 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74  0;..  /* A negat
d900: 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70  ive nCol is a sp
d910: 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61  ecial marker mea
d920: 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65  ning that we are
d930: 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
d940: 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74  trying to comput
d950: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
d960: 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72  es.  If we enter
d970: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
d980: 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69  th.  ** a negati
d990: 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e  ve nCol, it mean
d9a0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69  s two or more vi
d9b0: 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c  ews form a loop,
d9c0: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
d9d0: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
d9e0: 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c   VIEW one AS SEL
d9f0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a  ECT * FROM two;.
da00: 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
da10: 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45  VIEW two AS SELE
da20: 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20  CT * FROM one;. 
da30: 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
da40: 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69 73  y, this error is
da50: 20 63 61 75 67 68 74 20 70 72 65 76 69 6f 75 73   caught previous
da60: 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f  ly and so the fo
da70: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a  llowing test.  *
da80: 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  * should always 
da90: 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69  fail.  But we wi
daa0: 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70  ll leave it in p
dab0: 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20  lace just to be 
dac0: 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  safe..  */.  if(
dad0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20   pTable->nCol<0 
dae0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
daf0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
db00: 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75  view %s is circu
db10: 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20  larly defined", 
db20: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
db30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
db40: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  }.  assert( pTab
db50: 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a  le->nCol>=0 );..
db60: 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
db70: 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
db80: 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d  s we need to com
db90: 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e  pute the table n
dba0: 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20  ames..  ** Note 
dbb0: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
dbc0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
dbd0: 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c  tOfSelect() will
dbe0: 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a   expand any.  **
dbf0: 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e   "*" elements in
dc00: 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65 74   the results set
dc10: 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e 64   of the view and
dc20: 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72   will assign cur
dc30: 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  sors.  ** to the
dc40: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
dc50: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42   FROM clause.  B
dc60: 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e  ut we do not wan
dc70: 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a  t these changes.
dc80: 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61    ** to be perma
dc90: 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f  nent.  So the co
dca0: 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e  mputation is don
dcb0: 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  e on a copy of t
dcc0: 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73  he SELECT.  ** s
dcd0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
dce0: 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
dcf0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
dd00: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
dd10: 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74  ;.  pSel = sqlit
dd20: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
dd30: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29  pTable->pSelect)
dd40: 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a  ;.  if( pSel ){.
dd50: 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e      n = pParse->
dd60: 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  nTab;.    sqlite
dd70: 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
dd80: 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53  rsors(pParse, pS
dd90: 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70  el->pSrc);.    p
dda0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31  Table->nCol = -1
ddb0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
ddc0: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
ddd0: 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20  ION.    xAuth = 
dde0: 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64  db->xAuth;.    d
ddf0: 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20  b->xAuth = 0;.  
de00: 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
de10: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
de20: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
de30: 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74  l);.    db->xAut
de40: 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65  h = xAuth;.#else
de50: 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73  .    pSelTab = s
de60: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
de70: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
de80: 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  pSel);.#endif.  
de90: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
dea0: 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c   n;.    if( pSel
deb0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Tab ){.      ass
dec0: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ert( pTable->aCo
ded0: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54  l==0 );.      pT
dee0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65  able->nCol = pSe
def0: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
df00: 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
df10: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
df20: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e        pSelTab->n
df30: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Col = 0;.      p
df40: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
df50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
df60: 65 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c 54  eleteTable(pSelT
df70: 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c  ab);.      pTabl
df80: 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67  e->pSchema->flag
df90: 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56  s |= DB_UnresetV
dfa0: 69 65 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  iews;.    }else{
dfb0: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  .      pTable->n
dfc0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  Col = 0;.      n
dfd0: 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  Err++;.    }.   
dfe0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
dff0: 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a  lete(db, pSel);.
e000: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e    } else {.    n
e010: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69  Err++;.  }.#endi
e020: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
e030: 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72  _VIEW */.  retur
e040: 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64  n nErr;  .}.#end
e050: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
e060: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
e070: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
e080: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
e090: 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64  TABLE) */..#ifnd
e0a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
e0b0: 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  IEW./*.** Clear 
e0c0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
e0d0: 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57   from every VIEW
e0e0: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78   in database idx
e0f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e100: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
e110: 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  All(sqlite3 *db,
e120: 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73   int idx){.  Has
e130: 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20  hElem *i;.  if( 
e140: 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64  !DbHasProperty(d
e150: 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
e160: 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72  etViews) ) retur
e170: 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  n;.  for(i=sqlit
e180: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
e190: 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61  aDb[idx].pSchema
e1a0: 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d  ->tblHash); i;i=
e1b0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
e1c0: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
e1d0: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
e1e0: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
e1f0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
e200: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52 65  {.      sqliteRe
e210: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  setColumnNames(p
e220: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
e230: 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
e240: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
e250: 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23  resetViews);.}.#
e260: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71  else.# define sq
e270: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
e280: 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20  (A,B).#endif /* 
e290: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
e2a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
e2b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
e2c0: 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74  ed by the VDBE t
e2d0: 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74  o adjust the int
e2e0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
e2f0: 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77  used by SQLite w
e300: 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61  hen the btree la
e310: 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c  yer moves a tabl
e320: 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65  e root page. The
e330: 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  .** root-page of
e340: 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
e350: 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44  x in database iD
e360: 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72  b has changed fr
e370: 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69  om iFrom.** to i
e380: 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74  To..**.** Ticket
e390: 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d   #1728:  The sym
e3a0: 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20  bol table might 
e3b0: 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e  still contain in
e3c0: 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20  formation.** on 
e3d0: 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e  tables and/or in
e3e0: 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74  dices that are t
e3f0: 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  he process of be
e400: 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20  ing deleted..** 
e410: 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63  If you are unluc
e420: 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ky, one of those
e430: 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73   deleted indices
e440: 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74   or tables might
e450: 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d  .** have the sam
e460: 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65  e rootpage numbe
e470: 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61  r as the real ta
e480: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61  ble or index tha
e490: 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f  t is.** being mo
e4a0: 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e  ved.  So we cann
e4b0: 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e  ot stop searchin
e4c0: 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73  g after the firs
e4d0: 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61  t match .** beca
e4e0: 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61  use the first ma
e4f0: 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72  tch might be for
e500: 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65   one of the dele
e510: 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f  ted indices.** o
e520: 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74  r tables and not
e530: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
e540: 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c   that is actuall
e550: 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a  y being moved..*
e560: 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e  * We must contin
e570: 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ue looping until
e580: 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20   all tables and 
e590: 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20  indices with.** 
e5a0: 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20  rootpage==iFrom 
e5b0: 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72  have been conver
e5c0: 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f  ted to have a ro
e5d0: 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a  otpage of iTo.**
e5e0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
e5f0: 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20  certain that we 
e600: 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e  got the right on
e610: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
e620: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
e630: 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65  CUUM.void sqlite
e640: 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 44  3RootPageMoved(D
e650: 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46 72 6f  b *pDb, int iFro
e660: 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48  m, int iTo){.  H
e670: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
e680: 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a    Hash *pHash;..
e690: 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
e6a0: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
e6b0: 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
e6c0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
e6d0: 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
e6e0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
e6f0: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54  t(pElem)){.    T
e700: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
e710: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
e720: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  m);.    if( pTab
e730: 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
e740: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75  .      pTab->tnu
e750: 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
e760: 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44   }.  pHash = &pD
e770: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b->pSchema->idxH
e780: 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ash;.  for(pElem
e790: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
e7a0: 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  (pHash); pElem; 
e7b0: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
e7c0: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
e7d0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
e7e0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
e7f0: 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
e800: 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Idx->tnum==iFrom
e810: 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
e820: 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
e830: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
e840: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65  /*.** Write code
e850: 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61   to erase the ta
e860: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
e870: 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64  ge iTable from d
e880: 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20  atabase iDb..** 
e890: 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20  Also write code 
e8a0: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71  to modify the sq
e8b0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
e8c0: 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  e and internal s
e8d0: 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f  chema.** if a ro
e8e0: 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68  ot-page of anoth
e8f0: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
e900: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c  d by the btree-l
e910: 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65  ayer whilst.** e
e920: 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74  rasing iTable (t
e930: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
e940: 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
e950: 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
e960: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65   .static void de
e970: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61  stroyRootPage(Pa
e980: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
e990: 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62   iTable, int iDb
e9a0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
e9b0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
e9c0: 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20  arse);.  int r1 
e9d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
e9e0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
e9f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ea00: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
ea10: 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29  iTable, r1, iDb)
ea20: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
ea30: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
ea40: 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  /* OP_Destroy
ea50: 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e   stores an in in
ea60: 74 65 67 65 72 20 72 31 2e 20 49 66 20 74 68 69  teger r1. If thi
ea70: 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69  s integer.  ** i
ea80: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
ea90: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
eaa0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
eab0: 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a   table moved to.
eac0: 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54    ** location iT
ead0: 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  able. The follow
eae0: 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65  ing code modifie
eaf0: 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  s the sqlite_mas
eb00: 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a  ter table to.  *
eb10: 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a  * reflect this..
eb20: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23    **.  ** The "#
eb30: 25 64 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69  %d" in the SQL i
eb40: 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73  s a special cons
eb50: 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20  tant that means 
eb60: 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20  whatever value. 
eb70: 20 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20 74 6f   ** is on the to
eb80: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
eb90: 20 53 65 65 20 73 71 6c 69 74 65 33 52 65 67 69   See sqlite3Regi
eba0: 73 74 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f  sterExpr()..  */
ebb0: 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
ebc0: 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
ebd0: 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
ebe0: 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25  s SET rootpage=%
ebf0: 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20  d WHERE #%d AND 
ec00: 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20  rootpage=#%d",. 
ec10: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
ec20: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
ec30: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
ec40: 29 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72  ), iTable, r1, r
ec50: 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  1);.#endif.  sql
ec60: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
ec70: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
ec80: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56  }../*.** Write V
ec90: 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73  DBE code to eras
eca0: 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  e table pTab and
ecb0: 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
ecc0: 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e  indices on disk.
ecd0: 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61  .** Code to upda
ece0: 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  te the sqlite_ma
ecf0: 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20  ster tables and 
ed00: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
ed10: 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69  definitions.** i
ed20: 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61  n case a root-pa
ed30: 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
ed40: 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
ed50: 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
ed60: 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20  ree layer.** is 
ed70: 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73  also added (this
ed80: 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
ed90: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
eda0: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
edb0: 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
edc0: 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  yTable(Parse *pP
edd0: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
ede0: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
edf0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
ee00: 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  M.  Index *pIdx;
ee10: 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
ee20: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
ee30: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
ee40: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
ee50: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
ee60: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e  pParse, pTab->tn
ee70: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28  um, iDb);.  for(
ee80: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
ee90: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
eea0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
eeb0: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
eec0: 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e  pParse, pIdx->tn
eed0: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65  um, iDb);.  }.#e
eee0: 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  lse.  /* If the 
eef0: 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
ef00: 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
ef10: 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f  ble (if SQLITE_O
ef20: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
ef30: 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e   ** is not defin
ef40: 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ed), then it is 
ef50: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c  important to cal
ef60: 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20  l OP_Destroy on 
ef70: 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61  the.  ** table a
ef80: 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61  nd index root-pa
ef90: 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74  ges in order, st
efa0: 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
efb0: 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a  numerically .  *
efc0: 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  * largest root-p
efd0: 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
efe0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
eff0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f   none of the roo
f000: 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20  t-pages.  ** to 
f010: 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  be destroyed is 
f020: 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  relocated by an 
f030: 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72  earlier OP_Destr
f040: 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a  oy. i.e. if the.
f050: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
f060: 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a  ere coded:.  **.
f070: 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
f080: 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a  4 0.  ** ....  *
f090: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30  * OP_Destroy 5 0
f0a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72  .  **.  ** and r
f0b0: 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65  oot page 5 happe
f0c0: 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  ned to be the la
f0d0: 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
f0e0: 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
f0f0: 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
f100: 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f  n root page 5 wo
f110: 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20  uld be moved to 
f120: 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20  page 4 by the . 
f130: 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20   ** "OP_Destroy 
f140: 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65  4 0" opcode. The
f150: 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f   subsequent "OP_
f160: 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75  Destroy 5 0" wou
f170: 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72  ld hit.  ** a fr
f180: 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20  ee-list page..  
f190: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
f1a0: 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e  pTab->tnum;.  in
f1b0: 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30  t iDestroyed = 0
f1c0: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
f1d0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
f1e0: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65  ;.    int iLarge
f1f0: 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  st = 0;..    if(
f200: 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c   iDestroyed==0 |
f210: 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65  | iTab<iDestroye
f220: 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67  d ){.      iLarg
f230: 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  est = iTab;.    
f240: 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  }.    for(pIdx=p
f250: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
f260: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
f270: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
f280: 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75  iIdx = pIdx->tnu
f290: 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
f2a0: 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
f2b0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
f2c0: 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73  .      if( (iDes
f2d0: 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49  troyed==0 || (iI
f2e0: 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20  dx<iDestroyed)) 
f2f0: 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74  && iIdx>iLargest
f300: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72   ){.        iLar
f310: 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20  gest = iIdx;.   
f320: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
f330: 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29  f( iLargest==0 )
f340: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
f350: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f360: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
f370: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f380: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
f390: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
f3a0: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
f3b0: 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
f3c0: 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  st, iDb);.      
f3d0: 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61  iDestroyed = iLa
f3e0: 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  rgest;.    }.  }
f3f0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
f400: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
f410: 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
f420: 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
f430: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
f440: 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
f450: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
f460: 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
f470: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
f480: 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  e3DropTable(Pars
f490: 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
f4a0: 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
f4b0: 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72  sView, int noErr
f4c0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
f4d0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
f4e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
f4f0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
f500: 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Db;..  if( pPars
f510: 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
f520: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
f530: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
f540: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61  p_table;.  }.  a
f550: 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
f560: 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20  rc==1 );.  pTab 
f570: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
f580: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 73 56  able(pParse, isV
f590: 69 65 77 2c 20 0a 20 20 20 20 20 20 20 20 20 20  iew, .          
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5b0: 20 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e    pName->a[0].zN
f5c0: 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
f5d0: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20  .zDatabase);..  
f5e0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
f5f0: 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 7b 0a     if( noErr ){.
f600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
f610: 6f 72 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  orClear(pParse);
f620: 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20  .    }.    goto 
f630: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
f640: 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
f650: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
f660: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
f670: 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
f680: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
f690: 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49  ->nDb );..  /* I
f6a0: 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74  f pTab is a virt
f6b0: 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20  ual table, call 
f6c0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
f6d0: 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20  es() to ensure. 
f6e0: 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61   ** it is initia
f6f0: 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  lized..  */.  if
f700: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
f710: 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77  ) && sqlite3View
f720: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
f730: 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
f740: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
f750: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69  op_table;.  }.#i
f760: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f770: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
f780: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
f790: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
f7a0: 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
f7b0: 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
f7c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
f7d0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
f7e0: 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
f7f0: 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b  char *zArg2 = 0;
f800: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
f810: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
f820: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
f830: 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b   zTab, 0, zDb)){
f840: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
f850: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
f860: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
f870: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
f880: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
f890: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
f8a0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
f8b0: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ROP_TEMP_VIEW;. 
f8c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f8d0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
f8e0: 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20  E_DROP_VIEW;.   
f8f0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
f900: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
f910: 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20  TABLE.    }else 
f920: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
f930: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ab) ){.      cod
f940: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
f950: 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41  VTABLE;.      zA
f960: 72 67 32 20 3d 20 70 54 61 62 2d 3e 70 4d 6f 64  rg2 = pTab->pMod
f970: 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ->zName;.#endif.
f980: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f990: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
f9a0: 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
f9b0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
f9c0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
f9d0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
f9e0: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
f9f0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
fa00: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
fa10: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
fa20: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
fa30: 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, pTab->
fa40: 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44  zName, zArg2, zD
fa50: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
fa60: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
fa70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fa80: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
fa90: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
faa0: 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e  DELETE, pTab->zN
fab0: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
fac0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
fad0: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
fae0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
faf0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
fb00: 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
fb10: 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
fb20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
fb30: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
fb40: 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
fb50: 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70  t be dropped", p
fb60: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
fb70: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
fb80: 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e  table;.  }..#ifn
fb90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fba0: 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65  VIEW.  /* Ensure
fbb0: 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e   DROP TABLE is n
fbc0: 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65  ot used on a vie
fbd0: 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57  w, and DROP VIEW
fbe0: 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a   is not used.  *
fbf0: 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20  * on a table..  
fc00: 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20  */.  if( isView 
fc10: 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
fc20: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
fc30: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
fc40: 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42  e, "use DROP TAB
fc50: 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62  LE to delete tab
fc60: 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  le %s", pTab->zN
fc70: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
fc80: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
fc90: 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65    }.  if( !isVie
fca0: 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
fcb0: 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
fcc0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
fcd0: 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57  , "use DROP VIEW
fce0: 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20   to delete view 
fcf0: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
fd00: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
fd10: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
fd20: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
fd30: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
fd40: 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
fd50: 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
fd60: 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69  table.  ** on di
fd70: 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  sk..  */.  v = s
fd80: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
fd90: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
fda0: 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70  {.    Trigger *p
fdb0: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 44 62 20  Trigger;.    Db 
fdc0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
fdd0: 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb];.    sqlite
fde0: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
fdf0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
fe00: 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
fe10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
fe20: 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
fe30: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
fe40: 29 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76  ){.      Vdbe *v
fe50: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
fe60: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
fe70: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20   if( v ){.      
fe80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fe90: 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  Op0(v, OP_VBegin
fea0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
feb0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
fec0: 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72  Drop all trigger
fed0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
fee0: 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  h the table bein
fef0: 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a  g dropped. Code.
ff00: 20 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61      ** is genera
ff10: 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e  ted to remove en
ff20: 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74  tries from sqlit
ff30: 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a  e_master and/or.
ff40: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65      ** sqlite_te
ff50: 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71  mp_master if req
ff60: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
ff70: 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 61    pTrigger = pTa
ff80: 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20  b->pTrigger;.   
ff90: 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
ffa0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
ffb0: 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68  ( pTrigger->pSch
ffc0: 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
ffd0: 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  ma || .         
ffe0: 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
fff0: 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
10000 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
10010 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67  sqlite3DropTrigg
10020 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54  erPtr(pParse, pT
10030 72 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20 70  rigger);.      p
10040 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
10050 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
10060 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10070 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
10080 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  ENT.    /* Remov
10090 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66  e any entries of
100a0 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
100b0 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63  ence table assoc
100c0 69 61 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a  iated with.    *
100d0 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * the table bein
100e0 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20  g dropped. This 
100f0 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74  is done before t
10100 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70  he table is drop
10110 70 65 64 0a 20 20 20 20 2a 2a 20 61 74 20 74 68  ped.    ** at th
10120 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69  e btree level, i
10130 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74  n case the sqlit
10140 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
10150 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a   needs to.    **
10160 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c   move as a resul
10170 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63  t of the drop (c
10180 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74  an happen in aut
10190 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a  o-vacuum mode)..
101a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
101b0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
101c0 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
101d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
101e0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
101f0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45  rse,.        "DE
10200 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c  LETE FROM %s.sql
10210 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45  ite_sequence WHE
10220 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
10230 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c       pDb->zName,
10240 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pTab->zName.   
10250 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64     );.    }.#end
10260 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20  if..    /* Drop 
10270 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  all SQLITE_MASTE
10280 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  R table and inde
10290 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72  x entries that r
102a0 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20  efer to the.    
102b0 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72  ** table. The pr
102c0 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73  ogram name loops
102d0 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73   through the mas
102e0 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65  ter table and de
102f0 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65  letes.    ** eve
10300 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65  ry row that refe
10310 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66  rs to a table of
10320 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
10330 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a  s the one being.
10340 20 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20      ** dropped. 
10350 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e  Triggers are han
10360 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79 20  dled seperately 
10370 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65  because a trigge
10380 72 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20  r can be.    ** 
10390 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74  created in the t
103a0 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61  emp database tha
103b0 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
103c0 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20  ble in another. 
103d0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a     ** database..
103e0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
103f0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
10400 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22  arse, .        "
10410 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
10420 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65  s WHERE tbl_name
10430 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74  =%Q and type!='t
10440 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20  rigger'",.      
10450 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43    pDb->zName, SC
10460 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
10470 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
10480 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6e 79 20      /* Drop any 
10490 73 74 61 74 69 73 74 69 63 73 20 66 72 6f 6d 20  statistics from 
104a0 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
104b0 20 74 61 62 6c 65 2c 20 69 66 20 69 74 20 65 78   table, if it ex
104c0 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ists */.    if( 
104d0 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
104e0 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  (db, "sqlite_sta
104f0 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  t1", db->aDb[iDb
10500 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ].zName) ){.    
10510 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
10520 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
10530 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
10540 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74  M %Q.sqlite_stat
10550 31 20 57 48 45 52 45 20 74 62 6c 3d 25 51 22 2c  1 WHERE tbl=%Q",
10560 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61   pDb->zName, pTa
10570 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29  b->zName.      )
10580 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
10590 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56   !isView && !IsV
105a0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
105b0 20 20 20 20 20 20 64 65 73 74 72 6f 79 54 61 62        destroyTab
105c0 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  le(pParse, pTab)
105d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
105e0 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  Remove the table
105f0 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69   entry from SQLi
10600 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63  te's internal sc
10610 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a  hema and modify.
10620 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d      ** the schem
10630 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f  a cookie..    */
10640 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75  .    if( IsVirtu
10650 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
10660 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10670 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72  Op4(v, OP_VDestr
10680 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  oy, iDb, 0, 0, p
10690 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
106a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
106b0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
106c0 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62  P_DropTable, iDb
106d0 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 0, pTab->zN
106e0 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
106f0 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
10700 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
10710 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52   }.  sqliteViewR
10720 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29  esetAll(db, iDb)
10730 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  ;..exit_drop_tab
10740 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  le:.  sqlite3Src
10750 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
10760 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
10770 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10780 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
10790 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b   a new foreign k
107a0 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a  ey on the table.
107b0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
107c0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
107d0 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72    pFromCol deter
107e0 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75  mines which colu
107f0 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  mns.** in the cu
10800 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e  rrent table poin
10810 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e  t to the foreign
10820 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43   key.  If pFromC
10830 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f  ol==0 then.** co
10840 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f  nnect the key to
10850 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
10860 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20   inserted.  pTo 
10870 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a  is the name of.*
10880 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  * the table refe
10890 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c  rred to.  pToCol
108a0 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61   is a list of ta
108b0 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65  bles in the othe
108c0 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74  r.** pTo table t
108d0 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20  hat the foreign 
108e0 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  key points to.  
108f0 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61  flags contains a
10900 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
10910 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66  n about the conf
10920 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
10930 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69  algorithms speci
10940 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  fied.** in the O
10950 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44  N DELETE, ON UPD
10960 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52  ATE and ON INSER
10970 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  T clauses..**.**
10980 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75   An FKey structu
10990 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  re is created an
109a0 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  d added to the t
109b0 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a  able currently.*
109c0 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  * under construc
109d0 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72  tion in the pPar
109e0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69  se->pNewTable fi
109f0 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46 4b  eld.  The new FK
10a00 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e  ey.** is not lin
10a10 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b  ked into db->aFK
10a20 65 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ey at this point
10a30 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74   - that does not
10a40 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c   happen.** until
10a50 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
10a60 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ()..**.** The fo
10a70 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74  reign key is set
10a80 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70   for IMMEDIATE p
10a90 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75  rocessing.  A su
10aa0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
10ab0 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72   to sqlite3Defer
10ac0 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67  ForeignKey() mig
10ad0 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74  ht change this t
10ae0 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76  o DEFERRED..*/.v
10af0 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
10b00 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50  eForeignKey(.  P
10b10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10b20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
10b30 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
10b40 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20  List *pFromCol, 
10b50 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
10b60 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70  his table that p
10b70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61  oint to other ta
10b80 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
10b90 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pTo,          /*
10ba0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68   Name of the oth
10bb0 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  er table */.  Ex
10bc0 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20  prList *pToCol, 
10bd0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
10be0 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
10bf0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
10c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
10c10 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
10c20 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f  n algorithms. */
10c30 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
10c40 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10c50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10c60 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
10c70 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20    FKey *pFKey = 
10c80 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  0;.  Table *p = 
10c90 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
10ca0 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  e;.  int nByte;.
10cb0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
10cc0 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  Col;.  char *z;.
10cd0 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d  .  assert( pTo!=
10ce0 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
10cf0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
10d00 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
10d10 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  AB ) goto fk_end
10d20 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
10d30 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
10d40 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  Col = p->nCol-1;
10d50 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  .    if( iCol<0 
10d60 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
10d70 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26     if( pToCol &&
10d80 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
10d90 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
10da0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10db0 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  e, "foreign key 
10dc0 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20  on %s".         
10dd0 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e  " should referen
10de0 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75  ce only one colu
10df0 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c  mn of table %T",
10e00 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  .         p->aCo
10e10 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70  l[iCol].zName, p
10e20 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  To);.      goto 
10e30 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  fk_end;.    }.  
10e40 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65    nCol = 1;.  }e
10e50 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26  lse if( pToCol &
10e60 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
10e70 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72  =pFromCol->nExpr
10e80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
10e90 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
10ea0 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20          "number 
10eb0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f  of columns in fo
10ec0 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e  reign key does n
10ed0 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d  ot match the num
10ee0 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20  ber of ".       
10ef0 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65   "columns in the
10f00 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
10f10 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  e");.    goto fk
10f20 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _end;.  }else{. 
10f30 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43     nCol = pFromC
10f40 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20  ol->nExpr;.  }. 
10f50 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
10f60 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73  *pFKey) + nCol*s
10f70 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f  izeof(pFKey->aCo
10f80 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b  l[0]) + pTo->n +
10f90 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c   1;.  if( pToCol
10fa0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
10fb0 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72   i<pToCol->nExpr
10fc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42  ; i++){.      nB
10fd0 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54  yte += strlen(pT
10fe0 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
10ff0 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) + 1;.    }.  }
11000 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74  .  pFKey = sqlit
11010 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
11020 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
11030 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  ( pFKey==0 ){.  
11040 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
11050 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f   }.  pFKey->pFro
11060 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e  m = p;.  pFKey->
11070 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70  pNextFrom = p->p
11080 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61  FKey;.  z = (cha
11090 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20  r*)&pFKey[1];.  
110a0 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73  pFKey->aCol = (s
110b0 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a  truct sColMap*)z
110c0 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28  ;.  z += sizeof(
110d0 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a  struct sColMap)*
110e0 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a  nCol;.  pFKey->z
110f0 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79  To = z;.  memcpy
11100 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d  (z, pTo->z, pTo-
11110 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d  >n);.  z[pTo->n]
11120 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f   = 0;.  z += pTo
11130 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e  ->n+1;.  pFKey->
11140 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70  pNextTo = 0;.  p
11150 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  FKey->nCol = nCo
11160 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  l;.  if( pFromCo
11170 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65  l==0 ){.    pFKe
11180 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d  y->aCol[0].iFrom
11190 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
111a0 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
111b0 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
111c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  {.      int j;. 
111d0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
111e0 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  p->nCol; j++){. 
111f0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
11200 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f  e3StrICmp(p->aCo
11210 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f  l[j].zName, pFro
11220 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
11230 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11240 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
11250 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20  .iFrom = j;.    
11260 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11280 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e       if( j>=p->n
11290 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Col ){.        s
112a0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
112b0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
112c0 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d    "unknown colum
112d0 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65  n \"%s\" in fore
112e0 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
112f0 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  on", .          
11300 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
11310 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
11320 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
11330 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
11340 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
11350 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
11360 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
11370 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54  nt n = strlen(pT
11380 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
11390 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  );.      pFKey->
113a0 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a  aCol[i].zCol = z
113b0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
113c0 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
113d0 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
113e0 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[n] = 0;.      
113f0 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a  z += n+1;.    }.
11400 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44    }.  pFKey->isD
11410 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70  eferred = 0;.  p
11420 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66  FKey->deleteConf
11430 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b   = flags & 0xff;
11440 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65  .  pFKey->update
11450 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e  Conf = (flags >>
11460 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70   8 ) & 0xff;.  p
11470 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66  FKey->insertConf
11480 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20   = (flags >> 16 
11490 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20  ) & 0xff;..  /* 
114a0 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e  Link the foreign
114b0 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c   key to the tabl
114c0 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74  e as the last st
114d0 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46  ep..  */.  p->pF
114e0 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70  Key = pFKey;.  p
114f0 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e  FKey = 0;..fk_en
11500 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  d:.  sqlite3DbFr
11510 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23  ee(db, pFKey);.#
11520 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
11530 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  d(SQLITE_OMIT_FO
11540 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20  REIGN_KEY) */.  
11550 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
11560 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43  elete(db, pFromC
11570 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ol);.  sqlite3Ex
11580 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
11590 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a   pToCol);.}../*.
115a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
115b0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
115c0 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  n INITIALLY IMME
115d0 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c  DIATE or INITIAL
115e0 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63  LY DEFERRED.** c
115f0 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73  lause is seen as
11600 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69   part of a forei
11610 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
11620 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72  n.  The isDeferr
11630 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ed.** parameter 
11640 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c  is 1 for INITIAL
11650 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20  LY DEFERRED and 
11660 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  0 for INITIALLY 
11670 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68  IMMEDIATE..** Th
11680 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
11690 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
116a0 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20  created foreign 
116b0 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a  key is adjusted.
116c0 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ** accordingly..
116d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
116e0 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50  eferForeignKey(P
116f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
11700 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23  t isDeferred){.#
11710 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11720 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
11730 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
11740 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69  FKey *pFKey;.  i
11750 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73  f( (pTab = pPars
11760 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
11770 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61   || (pFKey = pTa
11780 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72  b->pFKey)==0 ) r
11790 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e  eturn;.  pFKey->
117a0 69 73 44 65 66 65 72 72 65 64 20 3d 20 69 73 44  isDeferred = isD
117b0 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a  eferred;.#endif.
117c0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
117d0 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
117e0 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c   erase and refil
117f0 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20  l index *pIdx.  
11800 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20  This is.** used 
11810 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  to initialize a 
11820 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e  newly created in
11830 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70  dex or to recomp
11840 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ute the.** conte
11850 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69  nt of an index i
11860 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20  n response to a 
11870 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
11880 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f  .**.** if memRoo
11890 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67  tPage is not neg
118a0 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20  ative, it means 
118b0 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69  that the index i
118c0 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74  s newly.** creat
118d0 65 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65  ed.  The registe
118e0 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d  r specified by m
118f0 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61  emRootPage conta
11900 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20  ins the.** root 
11910 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
11920 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65  he index.  If me
11930 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67  mRootPage is neg
11940 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  ative, then.** t
11950 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
11960 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74   exists and must
11970 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f   be cleared befo
11980 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65  re being refille
11990 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f  d and.** the roo
119a0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
119b0 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61   the index is ta
119c0 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d  ken from pIndex-
119d0 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  >tnum..*/.static
119e0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66   void sqlite3Ref
119f0 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a  illIndex(Parse *
11a00 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
11a10 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f  Index, int memRo
11a20 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65  otPage){.  Table
11a30 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
11a40 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65  >pTable;  /* The
11a50 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69   table that is i
11a60 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
11a70 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
11a80 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 42 74  Tab;       /* Bt
11a90 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ree cursor used 
11aa0 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  for pTab */.  in
11ab0 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d  t iIdx = pParse-
11ac0 3e 6e 54 61 62 2b 31 3b 20 20 20 20 20 2f 2a 20  >nTab+1;     /* 
11ad0 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
11ae0 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a  d for pIndex */.
11af0 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b10 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
11b20 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  op of loop */.  
11b30 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20  int tnum;       
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11b50 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  * Root page of i
11b60 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ndex */.  Vdbe *
11b70 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
11b80 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
11b90 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
11ba0 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
11bb0 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ine */.  KeyInfo
11bc0 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20   *pKey;         
11bd0 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e          /* KeyIn
11be0 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a  fo for index */.
11bf0 20 20 69 6e 74 20 72 65 67 49 64 78 4b 65 79 3b    int regIdxKey;
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c10 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 63 6f   /* Registers co
11c20 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64  ntaining the ind
11c30 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ex key */.  int 
11c40 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20  regRecord;      
11c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
11c60 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61  gister holding a
11c70 73 73 65 6d 62 6c 69 65 64 20 69 6e 64 65 78 20  ssemblied index 
11c80 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
11c90 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
11ca0 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68  ->db;      /* Th
11cb0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
11cc0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
11cd0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
11ce0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
11cf0 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
11d00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11d10 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
11d20 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
11d30 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
11d40 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  , SQLITE_REINDEX
11d50 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
11d60 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   0,.      db->aD
11d70 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29  b[iDb].zName ) )
11d80 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
11d90 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
11da0 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  equire a write-l
11db0 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
11dc0 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73   to perform this
11dd0 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
11de0 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
11df0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
11e00 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61  ab->tnum, 1, pTa
11e10 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20  b->zName);..  v 
11e20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
11e30 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
11e40 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
11e50 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
11e60 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20  >=0 ){.    tnum 
11e70 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20  = memRootPage;. 
11e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d   }else{.    tnum
11e90 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b   = pIndex->tnum;
11ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11eb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65  AddOp2(v, OP_Cle
11ec0 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ar, tnum, iDb);.
11ed0 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c    }.  pKey = sql
11ee0 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
11ef0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29  (pParse, pIndex)
11f00 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
11f10 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
11f20 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75  Write, iIdx, tnu
11f30 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20  m, iDb, .       
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
11f50 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45  ar *)pKey, P4_KE
11f60 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
11f70 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
11f80 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  e>=0 ){.    sqli
11f90 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
11fa0 76 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  v, 1);.  }.  sql
11fb0 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
11fc0 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
11fd0 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
11fe0 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  ad);.  addr1 = s
11ff0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12000 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
12010 54 61 62 2c 20 30 29 3b 0a 20 20 72 65 67 52 65  Tab, 0);.  regRe
12020 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
12030 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
12040 3b 0a 20 20 72 65 67 49 64 78 4b 65 79 20 3d 20  ;.  regIdxKey = 
12050 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
12060 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20  ndexKey(pParse, 
12070 70 49 6e 64 65 78 2c 20 69 54 61 62 2c 20 72 65  pIndex, iTab, re
12080 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 69  gRecord, 1);.  i
12090 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  f( pIndex->onErr
120a0 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20  or!=OE_None ){. 
120b0 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20     int j1, j2;. 
120c0 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b     int regRowid;
120d0 0a 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d  ..    regRowid =
120e0 20 72 65 67 49 64 78 4b 65 79 20 2b 20 70 49 6e   regIdxKey + pIn
120f0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  dex->nColumn;.  
12100 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
12110 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
12120 73 4e 75 6c 6c 2c 20 72 65 67 49 64 78 4b 65 79  sNull, regIdxKey
12130 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  , 0, pIndex->nCo
12140 6c 75 6d 6e 29 3b 0a 20 20 20 20 6a 32 20 3d 20  lumn);.    j2 = 
12150 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12160 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65  4(v, OP_IsUnique
12170 2c 20 69 49 64 78 2c 0a 20 20 20 20 20 20 20 20  , iIdx,.        
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12190 20 20 20 30 2c 20 72 65 67 52 6f 77 69 64 2c 20     0, regRowid, 
121a0 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
121b0 52 28 72 65 67 52 65 63 6f 72 64 29 2c 20 50 34  R(regRecord), P4
121c0 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 73 71 6c  _INT32);.    sql
121d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
121e0 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
121f0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45  E_CONSTRAINT, OE
12200 5f 41 62 6f 72 74 2c 20 30 2c 0a 20 20 20 20 20  _Abort, 0,.     
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
12220 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20  indexed columns 
12230 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c  are not unique",
12240 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
12250 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
12260 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
12270 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
12280 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 7d  Here(v, j2);.  }
12290 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
122a0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
122b0 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52  sert, iIdx, regR
122c0 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
122d0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
122e0 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
122f0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
12300 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
12310 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b  xt, iTab, addr1+
12320 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
12330 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
12340 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
12350 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
12360 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73  lose, iTab);.  s
12370 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
12380 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
12390 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  dx);.}../*.** Cr
123a0 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
123b0 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
123c0 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65  e.  pName1.pName
123d0 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  2 is the name of
123e0 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
123f0 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74  nd pTblList is t
12400 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
12410 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
12420 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
12430 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
12440 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
12450 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
12460 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
12470 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
12480 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
12490 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
124a0 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
124b0 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
124c0 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
124d0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
124e0 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
124f0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
12500 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
12510 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
12520 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
12530 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
12540 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
12550 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
12560 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
12570 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
12580 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
12590 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
125a0 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
125b0 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
125c0 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
125d0 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
125e0 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
125f0 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
12600 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
12610 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
12620 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61  reateIndex(.  Pa
12630 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
12640 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74   /* All informat
12650 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70  ion about this p
12660 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  arse */.  Token 
12670 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
12680 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e  First part of in
12690 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
126a0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
126b0 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
126c0 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
126d0 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
126e0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63  be NULL */.  Src
126f0 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20  List *pTblName, 
12700 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65  /* Table to inde
12710 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70  x. Use pParse->p
12720 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f  NewTable if 0 */
12730 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
12740 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  st,   /* A list 
12750 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
12760 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
12770 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
12780 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45   /* OE_Abort, OE
12790 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c  _Ignore, OE_Repl
127a0 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20  ace, or OE_None 
127b0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
127c0 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  rt,     /* The C
127d0 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
127e0 20 62 65 67 69 6e 73 20 74 68 69 73 20 73 74 61   begins this sta
127f0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
12800 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 2f  n *pEnd,       /
12810 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20 63  * The ")" that c
12820 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54 45  loses the CREATE
12830 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
12840 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
12850 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74  der,     /* Sort
12860 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72   order of primar
12870 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74  y key when pList
12880 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  ==NULL */.  int 
12890 69 66 4e 6f 74 45 78 69 73 74 20 20 20 20 20 2f  ifNotExist     /
128a0 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20  * Omit error if 
128b0 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
128c0 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
128d0 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20  le *pTab = 0;   
128e0 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
128f0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e   indexed */.  In
12900 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b  dex *pIndex = 0;
12910 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
12920 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f  to be created */
12930 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
12940 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20   0;     /* Name 
12950 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
12960 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
12970 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12980 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
12990 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  n zName */.  int
129a0 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e   i, j;.  Token n
129b0 75 6c 6c 49 64 3b 20 20 20 20 20 20 20 20 2f 2a  ullId;        /*
129c0 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20   Fake token for 
129d0 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74  an empty ID list
129e0 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46   */.  DbFixer sF
129f0 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ix;        /* Fo
12a00 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61  r assigning data
12a10 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54  base names to pT
12a20 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  able */.  int so
12a30 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f  rtOrderMask;   /
12a40 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53  * 1 to honor DES
12a50 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74  C in index.  0 t
12a60 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73  o ignore. */.  s
12a70 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
12a80 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70  rse->db;.  Db *p
12a90 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
12aa0 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20  /* The specific 
12ab0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
12ac0 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74   the indexed dat
12ad0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
12ae0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
12af0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
12b00 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
12b10 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a   being written *
12b20 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
12b30 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75   = 0;    /* Unqu
12b40 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
12b50 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65  the index to cre
12b60 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
12b70 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
12b80 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72  ListItem; /* For
12b90 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c   looping over pL
12ba0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ist */.  int nCo
12bb0 6c 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  l;.  int nExtra 
12bc0 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78  = 0;.  char *zEx
12bd0 74 72 61 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  tra;..  if( pPar
12be0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
12bf0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
12c00 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
12c10 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
12c20 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12c30 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
12c40 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
12c50 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
12c60 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
12c70 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
12c80 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e    */.  if( pTblN
12c90 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f  ame!=0 ){..    /
12ca0 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61  * Use the two-pa
12cb0 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f  rt index name to
12cc0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64   determine the d
12cd0 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
12ce0 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68  to search for th
12cf0 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74  e table. 'Fix' t
12d00 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  he table name to
12d10 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20   this db.    ** 
12d20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75  before looking u
12d30 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  p the table..   
12d40 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
12d50 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32  pName1 && pName2
12d60 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
12d70 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
12d80 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
12d90 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
12da0 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
12db0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
12dc0 74 65 5f 69 6e 64 65 78 3b 0a 0a 23 69 66 6e 64  te_index;..#ifnd
12dd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
12de0 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20  EMPDB.    /* If 
12df0 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77  the index name w
12e00 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20  as unqualified, 
12e10 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 68 65  check if the the
12e20 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73   table.    ** is
12e30 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49   a temp table. I
12e40 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61  f so, set the da
12e50 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20  tabase to 1. Do 
12e60 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20  not do this.    
12e70 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69  ** if initialisi
12e80 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 73 63  ng a database sc
12e90 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  hema..    */.   
12ea0 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
12eb0 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61  usy ){.      pTa
12ec0 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  b = sqlite3SrcLi
12ed0 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  stLookup(pParse,
12ee0 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20   pTblName);.    
12ef0 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20    if( pName2 && 
12f00 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20  pName2->n==0 && 
12f10 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53  pTab && pTab->pS
12f20 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
12f30 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ].pSchema ){.   
12f40 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20       iDb = 1;.  
12f50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
12f60 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69  if..    if( sqli
12f70 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
12f80 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
12f90 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26  index", pName) &
12fa0 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  &.        sqlite
12fb0 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69  3FixSrcList(&sFi
12fc0 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20  x, pTblName).   
12fd0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63   ){.      /* Bec
12fe0 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20  ause the parser 
12ff0 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e  constructs pTblN
13000 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ame from a singl
13010 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20  e identifier,.  
13020 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69      ** sqlite3Fi
13030 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76  xSrcList can nev
13040 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20  er fail. */.    
13050 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20    assert(0);.   
13060 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71   }.    pTab = sq
13070 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
13080 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 62 6c  (pParse, 0, pTbl
13090 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
130a0 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e  , .        pTblN
130b0 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
130c0 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ase);.    if( !p
130d0 54 61 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Tab || db->mallo
130e0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  cFailed ) goto e
130f0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13100 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
13110 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
13120 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
13130 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  a );.  }else{.  
13140 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
13150 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
13160 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
13170 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  le;.    if( !pTa
13180 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  b ) goto exit_cr
13190 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
131a0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
131b0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
131c0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
131d0 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e   }.  pDb = &db->
131e0 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 69 66 28  aDb[iDb];..  if(
131f0 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72   pTab==0 || pPar
13200 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
13210 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13220 78 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  x;.  if( sqlite3
13230 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
13240 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
13250 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71   7)==0 ){.    sq
13260 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13270 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
13280 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
13290 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
132a0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
132b0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
132c0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
132d0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
132e0 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
132f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13300 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13310 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65  views may not be
13320 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
13330 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13340 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
13350 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
13360 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
13370 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
13380 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
13390 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
133a0 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61  (pParse, "virtua
133b0 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  l tables may not
133c0 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
133d0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
133e0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
133f0 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  endif..  /*.  **
13400 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f   Find the name o
13410 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
13420 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
13430 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f   not already ano
13440 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ther.  ** index 
13450 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  or table with th
13460 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20  e same name.  . 
13470 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
13480 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72  on:  If we are r
13490 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  eading the names
134a0 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e   of permanent in
134b0 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20  dices from the. 
134c0 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ** sqlite_maste
134d0 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65  r table (because
134e0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
134f0 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20  ess changed the 
13500 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a  schema) and.  **
13510 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
13520 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73  x names collides
13530 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f   with the name o
13540 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  f a temporary ta
13550 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65  ble or.  ** inde
13560 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  x, then we will 
13570 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63  continue to proc
13580 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a  ess this index..
13590 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61    **.  ** If pNa
135a0 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
135b0 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20  hat we are.  ** 
135c0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70  dealing with a p
135d0 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e  rimary key or UN
135e0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
135f0 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
13600 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e  ent our.  ** own
13610 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   name..  */.  if
13620 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
13630 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
13640 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
13650 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
13660 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
13670 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
13680 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74  rse) ) goto exit
13690 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
136a0 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
136b0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
136c0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
136d0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
136e0 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
136f0 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
13700 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
13710 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13720 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
13730 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
13740 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51   ){.      if( SQ
13750 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
13760 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
13770 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  e) ) goto exit_c
13780 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13790 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
137a0 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
137b0 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  e, 0)!=0 ){.    
137c0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
137d0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
137e0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
137f0 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c  table named %s",
13800 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
13810 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13820 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
13830 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
13840 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
13850 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e  db, zName, pDb->
13860 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
13870 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69     if( !ifNotExi
13880 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  st ){.        sq
13890 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
138a0 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20  arse, "index %s 
138b0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
138c0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
138d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
138e0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
138f0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
13900 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64    int n;.    Ind
13910 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66  ex *pLoop;.    f
13920 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70  or(pLoop=pTab->p
13930 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f  Index, n=1; pLoo
13940 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
13950 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  pNext, n++){}.  
13960 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
13970 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71  3MPrintf(db, "sq
13980 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25  lite_autoindex_%
13990 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s_%d", pTab->zNa
139a0 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20  me, n);.    if( 
139b0 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
139c0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
139d0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
139e0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
139f0 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  for authorizatio
13a00 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69  n to create an i
13a10 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ndex..  */.#ifnd
13a20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13a30 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
13a40 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
13a50 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d  *zDb = pDb->zNam
13a60 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
13a70 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
13a80 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
13a90 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
13aa0 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  iDb), 0, zDb) ){
13ab0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
13ac0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13ad0 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c     }.    i = SQL
13ae0 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
13af0 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  ;.    if( !OMIT_
13b00 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
13b10 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52   ) i = SQLITE_CR
13b20 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  EATE_TEMP_INDEX;
13b30 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13b40 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
13b50 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62  , i, zName, pTab
13b60 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
13b70 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
13b80 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13b90 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
13ba0 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
13bb0 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
13bc0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
13bd0 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
13be0 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
13bf0 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
13c00 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
13c10 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
13c20 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
13c30 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
13c40 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
13c50 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
13c60 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
13c70 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20  .    nullId.z = 
13c80 28 75 38 2a 29 70 54 61 62 2d 3e 61 43 6f 6c 5b  (u8*)pTab->aCol[
13c90 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e  pTab->nCol-1].zN
13ca0 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  ame;.    nullId.
13cb0 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72  n = strlen((char
13cc0 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20  *)nullId.z);.   
13cd0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
13ce0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
13cf0 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 6e 75  Parse, 0, 0, &nu
13d00 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70  llId);.    if( p
13d10 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
13d20 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13d30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30  ;.    pList->a[0
13d40 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f  ].sortOrder = so
13d50 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
13d60 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
13d70 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  w many bytes of 
13d80 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72  space are requir
13d90 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c  ed to store expl
13da0 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63  icitly.  ** spec
13db0 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ified collation 
13dc0 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a  sequence names..
13dd0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
13de0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
13df0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
13e00 70 45 78 70 72 3b 0a 20 20 20 20 43 6f 6c 6c 53  pExpr;.    CollS
13e10 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69  eq *pColl;.    i
13e20 66 28 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73  f( (pExpr = pLis
13e30 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 21 3d  t->a[i].pExpr)!=
13e40 30 20 26 26 20 28 70 43 6f 6c 6c 20 3d 20 70 45  0 && (pColl = pE
13e50 78 70 72 2d 3e 70 43 6f 6c 6c 29 21 3d 30 20 29  xpr->pColl)!=0 )
13e60 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b  {.      nExtra +
13e70 3d 20 28 31 20 2b 20 73 74 72 6c 65 6e 28 70 43  = (1 + strlen(pC
13e80 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  oll->zName));.  
13e90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20    }.  }..  /* . 
13ea0 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   ** Allocate the
13eb0 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
13ec0 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20  . .  */.  nName 
13ed0 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
13ee0 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73 74 2d  .  nCol = pList-
13ef0 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78  >nExpr;.  pIndex
13f00 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
13f10 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20  ocZero(db, .    
13f20 20 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20    sizeof(Index) 
13f30 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  +              /
13f40 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
13f50 65 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  e  */.      size
13f60 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20  of(int)*nCol +  
13f70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
13f80 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a  x.aiColumn   */.
13f90 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74        sizeof(int
13fa0 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20  )*(nCol+1) +    
13fb0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f     /* Index.aiRo
13fc0 77 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20  wEst   */.      
13fd0 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 2a 6e  sizeof(char *)*n
13fe0 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 2f 2a 20  Col +        /* 
13ff0 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20  Index.azColl    
14000 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
14010 28 75 38 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20  (u8)*nCol +     
14020 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
14030 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20  aSortOrder */.  
14040 20 20 20 20 6e 4e 61 6d 65 20 2b 20 31 20 2b 20      nName + 1 + 
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14060 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20   /* Index.zName 
14070 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45       */.      nE
14080 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20  xtra            
14090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
140a0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
140b0 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a 20   names */.  );. 
140c0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
140d0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
140e0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
140f0 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  dex;.  }.  pInde
14100 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  x->azColl = (cha
14110 72 2a 2a 29 28 26 70 49 6e 64 65 78 5b 31 5d 29  r**)(&pIndex[1])
14120 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
14130 6c 75 6d 6e 20 3d 20 28 69 6e 74 20 2a 29 28 26  lumn = (int *)(&
14140 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e  pIndex->azColl[n
14150 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Col]);.  pIndex-
14160 3e 61 69 52 6f 77 45 73 74 20 3d 20 28 75 6e 73  >aiRowEst = (uns
14170 69 67 6e 65 64 20 2a 29 28 26 70 49 6e 64 65 78  igned *)(&pIndex
14180 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d  ->aiColumn[nCol]
14190 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f  );.  pIndex->aSo
141a0 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29  rtOrder = (u8 *)
141b0 28 26 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45  (&pIndex->aiRowE
141c0 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a 20 20 70  st[nCol+1]);.  p
141d0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28  Index->zName = (
141e0 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d  char *)(&pIndex-
141f0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c  >aSortOrder[nCol
14200 5d 29 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 28  ]);.  zExtra = (
14210 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d  char *)(&pIndex-
14220 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29  >zName[nName+1])
14230 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65  ;.  memcpy(pInde
14240 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  x->zName, zName,
14250 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e   nName+1);.  pIn
14260 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
14270 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43  ab;.  pIndex->nC
14280 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  olumn = pList->n
14290 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  Expr;.  pIndex->
142a0 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f  onError = onErro
142b0 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74  r;.  pIndex->aut
142c0 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d  oIndex = pName==
142d0 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63  0;.  pIndex->pSc
142e0 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
142f0 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 0a 20 20  Db].pSchema;..  
14300 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
14310 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e  if we should hon
14320 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74 73  or DESC requests
14330 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   on index column
14340 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62  s.  */.  if( pDb
14350 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f  ->pSchema->file_
14360 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20  format>=4 ){.   
14370 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
14380 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20   -1;   /* Honor 
14390 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  DESC */.  }else{
143a0 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
143b0 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67  sk = 0;    /* Ig
143c0 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d  nore DESC */.  }
143d0 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20  ..  /* Scan the 
143e0 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
143f0 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c  umns of the tabl
14400 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
14410 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68  and.  ** load th
14420 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73  e column indices
14430 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20   into the Index 
14440 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f  structure.  Repo
14450 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a  rt an error.  **
14460 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69   if any column i
14470 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  s not found..  *
14480 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69  /.  for(i=0, pLi
14490 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b  stItem=pList->a;
144a0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
144b0 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b   i++, pListItem+
144c0 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
144d0 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70  ar *zColName = p
144e0 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b  ListItem->zName;
144f0 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 54 61  .    Column *pTa
14500 62 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 72 65  bCol;.    int re
14510 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
14520 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  ;.    char *zCol
14530 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
14540 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f       /* Collatio
14550 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20  n sequence name 
14560 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c  */..    for(j=0,
14570 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61   pTabCol=pTab->a
14580 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  Col; j<pTab->nCo
14590 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b  l; j++, pTabCol+
145a0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
145b0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f  lite3StrICmp(zCo
145c0 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d 3e  lName, pTabCol->
145d0 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
145e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
145f0 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29   j>=pTab->nCol )
14600 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
14610 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14620 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f  "table %s has no
14630 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73   column named %s
14640 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
14650 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65  >zName, zColName
14660 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
14670 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
14680 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 54 4f  .    }.    /* TO
14690 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74 20  DO:  Add a test 
146a0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
146b0 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  t the same colum
146c0 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20  n is not named. 
146d0 20 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20     ** more than 
146e0 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65 20  once within the 
146f0 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c  same index.  Onl
14700 79 20 74 68 65 20 66 69 72 73 74 20 69 6e 73 74  y the first inst
14710 61 6e 63 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  ance of.    ** t
14720 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65  he column will e
14730 76 65 72 20 62 65 20 75 73 65 64 20 62 79 20 74  ver be used by t
14740 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e  he optimizer.  N
14750 6f 74 65 20 74 68 61 74 20 75 73 69 6e 67 20 74  ote that using t
14760 68 65 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 63  he.    ** same c
14770 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20  olumn more than 
14780 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62 65 20 61  once cannot be a
14790 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20  n error because 
147a0 74 68 61 74 20 77 6f 75 6c 64 20 0a 20 20 20 20  that would .    
147b0 2a 2a 20 62 72 65 61 6b 20 62 61 63 6b 77 61 72  ** break backwar
147c0 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
147d0 20 2d 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62   - it needs to b
147e0 65 20 61 20 77 61 72 6e 69 6e 67 2e 0a 20 20 20  e a warning..   
147f0 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   */.    pIndex->
14800 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b  aiColumn[i] = j;
14810 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49 74  .    if( pListIt
14820 65 6d 2d 3e 70 45 78 70 72 20 26 26 20 70 4c 69  em->pExpr && pLi
14830 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70  stItem->pExpr->p
14840 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61 73  Coll ){.      as
14850 73 65 72 74 28 20 70 4c 69 73 74 49 74 65 6d 2d  sert( pListItem-
14860 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b  >pExpr->pColl );
14870 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a  .      zColl = z
14880 45 78 74 72 61 3b 0a 20 20 20 20 20 20 73 71 6c  Extra;.      sql
14890 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45  ite3_snprintf(nE
148a0 78 74 72 61 2c 20 7a 45 78 74 72 61 2c 20 22 25  xtra, zExtra, "%
148b0 73 22 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  s", pListItem->p
148c0 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61  Expr->pColl->zNa
148d0 6d 65 29 3b 0a 20 20 20 20 20 20 7a 45 78 74 72  me);.      zExtr
148e0 61 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 43 6f  a += (strlen(zCo
148f0 6c 6c 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 65  ll) + 1);.    }e
14900 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  lse{.      zColl
14910 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
14920 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66  .zColl;.      if
14930 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !zColl ){.    
14940 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d 3e      zColl = db->
14950 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  pDfltColl->zName
14960 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14970 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
14980 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74  t.busy && !sqlit
14990 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
149a0 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d  pParse, zColl, -
149b0 31 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  1) ){.      goto
149c0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
149d0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
149e0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
149f0 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71  = zColl;.    req
14a00 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20  uestedSortOrder 
14a10 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72  = pListItem->sor
14a20 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64  tOrder & sortOrd
14a30 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64  erMask;.    pInd
14a40 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
14a50 5d 20 3d 20 72 65 71 75 65 73 74 65 64 53 6f 72  ] = requestedSor
14a60 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 73 71  tOrder;.  }.  sq
14a70 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45  lite3DefaultRowE
14a80 73 74 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69  st(pIndex);..  i
14a90 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d  f( pTab==pParse-
14aa0 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20  >pNewTable ){.  
14ab0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
14ac0 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  e has been calle
14ad0 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61  d to create an a
14ae0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61  utomatic index a
14af0 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  s a.    ** resul
14b00 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b  t of a PRIMARY K
14b10 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
14b20 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20  use on a column 
14b30 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20  definition, or. 
14b40 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20     ** a PRIMARY 
14b50 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
14b60 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ause following t
14b70 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69  he column defini
14b80 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e  tions..    ** i.
14b90 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a  e. one of:.    *
14ba0 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  *.    ** CREATE 
14bb0 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52  TABLE t(x PRIMAR
14bc0 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a  Y KEY, y);.    *
14bd0 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
14be0 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c  (x, y, UNIQUE(x,
14bf0 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20   y));.    **.   
14c00 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20   ** Either way, 
14c10 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
14c20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
14c30 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e  y has such an in
14c40 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73  dex. If.    ** s
14c50 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  o, don't bother 
14c60 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e  creating this on
14c70 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70  e. This only app
14c80 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61  lies to.    ** a
14c90 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65  utomatically cre
14ca0 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73  ated indices. Us
14cb0 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68  ers can do as th
14cc0 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20  ey wish with.   
14cd0 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64   ** explicit ind
14ce0 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ices..    */.   
14cf0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
14d00 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
14d10 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
14d20 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
14d30 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20  {.      int k;. 
14d40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
14d50 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
14d60 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  one );.      ass
14d70 65 72 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49  ert( pIdx->autoI
14d80 6e 64 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73  ndex );.      as
14d90 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e  sert( pIndex->on
14da0 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
14db0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  ;..      if( pId
14dc0 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64  x->nColumn!=pInd
14dd0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f  ex->nColumn ) co
14de0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
14df0 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e  r(k=0; k<pIdx->n
14e00 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20  Column; k++){.  
14e10 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
14e20 20 2a 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43   *z1 = pIdx->azC
14e30 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  oll[k];.        
14e40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d  const char *z2 =
14e50 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
14e60 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k];.        if( 
14e70 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
14e80 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  ]!=pIndex->aiCol
14e90 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  umn[k] ) break;.
14ea0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
14eb0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 21  ->aSortOrder[k]!
14ec0 3d 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72  =pIndex->aSortOr
14ed0 64 65 72 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  der[k] ) break;.
14ee0 20 20 20 20 20 20 20 20 69 66 28 20 7a 31 21 3d          if( z1!=
14ef0 7a 32 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  z2 && sqlite3Str
14f00 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62  ICmp(z1, z2) ) b
14f10 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
14f20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d      if( k==pIdx-
14f30 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
14f40 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
14f50 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f  Error!=pIndex->o
14f60 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  nError ){.      
14f70 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73      /* This cons
14f80 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20 74  traint creates t
14f90 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73  he same index as
14fa0 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
14fb0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
14fc0 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73 6f  int specified so
14fd0 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 43  mewhere in the C
14fe0 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
14ff0 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20  ement..         
15000 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20   ** However the 
15010 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
15020 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  ses are differen
15030 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73 20  t. If both this 
15040 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
15050 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
15060 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76 61   previous equiva
15070 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  lent constraint 
15080 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20  have explicit.  
15090 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f          ** ON CO
150a0 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74  NFLICT clauses t
150b0 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  his is an error.
150c0 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
150d0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
150e0 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
150f0 69 66 69 65 64 20 62 65 68 61 76 69 6f 75 72 20  ified behaviour 
15100 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  for the index.. 
15110 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
15120 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78        if( !(pIdx
15130 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
15140 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d  fault || pIndex-
15150 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
15160 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ault) ){.       
15170 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15180 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
151a0 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f  onflicting ON CO
151b0 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73  NFLICT clauses s
151c0 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20  pecified", 0);. 
151d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
151e0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
151f0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
15200 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  lt ){.          
15210 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20    pIdx->onError 
15220 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  = pIndex->onErro
15230 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
15240 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15250 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
15260 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
15270 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
15280 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e   Link the new In
15290 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f  dex structure to
152a0 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74   its table and t
152b0 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a  o the other.  **
152c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
152d0 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20  ase structures. 
152e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
152f0 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
15300 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70   Index *p;.    p
15310 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
15320 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53  sert(&pIndex->pS
15330 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
15340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15350 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
15360 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
15370 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31  pIndex->zName)+1
15380 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  , pIndex);.    i
15390 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73  f( p ){.      as
153a0 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20  sert( p==pIndex 
153b0 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
153c0 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
153d0 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  /.      db->mall
153e0 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
153f0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
15400 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
15410 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  }.    db->flags 
15420 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
15430 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28  Changes;.    if(
15440 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
15450 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e        pIndex->tn
15460 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
15470 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  wTnum;.    }.  }
15480 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
15490 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30  ->init.busy is 0
154a0 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
154b0 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20   index on disk. 
154c0 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c   This.  ** invol
154d0 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20  ves writing the 
154e0 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d  index into the m
154f0 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
15500 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20  filling in the. 
15510 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74   ** index with t
15520 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
15530 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a   contents..  **.
15540 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69    ** The db->ini
15550 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65 6e  t.busy is 0 when
15560 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20   the user first 
15570 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20  enters a CREATE 
15580 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d  INDEX .  ** comm
15590 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62  and.  db->init.b
155a0 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61 20  usy is 1 when a 
155b0 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
155c0 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45  ed and .  ** CRE
155d0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
155e0 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75  ents are read ou
155f0 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  t of the master 
15600 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20  table.  In.  ** 
15610 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20  the latter case 
15620 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
15630 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  y exists on disk
15640 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20  , which is why. 
15650 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
15660 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74  t to recreate it
15670 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
15680 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
15690 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
156a0 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
156b0 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a   primary key.  *
156c0 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  * or UNIQUE cons
156d0 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41  traint of a CREA
156e0 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
156f0 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74  nt.  Since the t
15700 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75  able.  ** has ju
15710 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  st been created,
15720 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
15730 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64  data and the ind
15740 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
15750 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20  n.  ** step can 
15760 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  be skipped..  */
15770 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d 3e  .  else if( db->
15780 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
15790 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
157a0 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
157b0 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70    int iMem = ++p
157c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20  Parse->nMem;..  
157d0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
157e0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
157f0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
15800 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
15810 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72  dex;...    /* Cr
15820 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67  eate the rootpag
15830 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a  e for the index.
15840 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
15850 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
15860 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
15870 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
15880 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15890 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20  OP_CreateIndex, 
158a0 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20  iDb, iMem);..   
158b0 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20 63   /* Gather the c
158c0 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
158d0 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
158e0 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a   statement into.
158f0 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74      ** the zStmt
15900 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f   variable.    */
15910 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20  .    if( pStart 
15920 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  && pEnd ){.     
15930 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65   /* A named inde
15940 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63  x with an explic
15950 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  it CREATE INDEX 
15960 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
15970 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
15980 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43  e3MPrintf(db, "C
15990 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e  REATE%s INDEX %.
159a0 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45  *s",.        onE
159b0 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20  rror==OE_None ? 
159c0 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a  "" : " UNIQUE",.
159d0 20 20 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a 20          pEnd->z 
159e0 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a  - pName->z + 1,.
159f0 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a          pName->z
15a00 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15a10 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61      /* An automa
15a20 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65  tic index create
15a30 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b  d by a PRIMARY K
15a40 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  EY or UNIQUE con
15a50 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
15a60 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69   /* zStmt = sqli
15a70 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20  te3MPrintf(""); 
15a80 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
15a90 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
15aa0 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69  * Add an entry i
15ab0 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n sqlite_master 
15ac0 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20  for this index. 
15ad0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
15ae0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
15af0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49  rse, .        "I
15b00 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73  NSERT INTO %Q.%s
15b10 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c   VALUES('index',
15b20 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c  %Q,%Q,#%d,%Q);",
15b30 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  .        db->aDb
15b40 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
15b50 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
15b60 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
15b70 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70  zName,.        p
15b80 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
15b90 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20      iMem,.      
15ba0 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20    zStmt.    );. 
15bb0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15bc0 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20  (db, zStmt);..  
15bd0 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e    /* Fill the in
15be0 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e  dex with data an
15bf0 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63  d reparse the sc
15c00 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50  hema. Code an OP
15c10 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74  _Expire.    ** t
15c20 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  o invalidate all
15c30 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
15c40 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f  atements..    */
15c50 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
15c60 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
15c70 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
15c80 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d  arse, pIndex, iM
15c90 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
15ca0 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
15cb0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
15cc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15cd0 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72 73 65  dOp4(v, OP_Parse
15ce0 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20  Schema, iDb, 0, 
15cf0 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  0,.         sqli
15d00 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
15d10 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64  name='%q'", pInd
15d20 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44  ex->zName), P4_D
15d30 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73  YNAMIC);.      s
15d40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
15d50 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30  (v, OP_Expire, 0
15d60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
15d70 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61  /* When adding a
15d80 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  n index to the l
15d90 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66  ist of indices f
15da0 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65  or a table, make
15db0 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69  .  ** sure all i
15dc0 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f  ndices labeled O
15dd0 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61  E_Replace come a
15de0 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c  fter all those l
15df0 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49  abeled.  ** OE_I
15e00 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20  gnore.  This is 
15e10 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68  necessary for th
15e20 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  e correct operat
15e30 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20  ion of UPDATE.  
15e40 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20  ** and INSERT.. 
15e50 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
15e60 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e  it.busy || pTblN
15e70 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ame==0 ){.    if
15e80 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ( onError!=OE_Re
15e90 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70  place || pTab->p
15ea0 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20  Index==0.       
15eb0 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65    || pTab->pInde
15ec0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  x->onError==OE_R
15ed0 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70  eplace){.      p
15ee0 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
15ef0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
15f00 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20     pTab->pIndex 
15f10 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  = pIndex;.    }e
15f20 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
15f30 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d   *pOther = pTab-
15f40 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77  >pIndex;.      w
15f50 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
15f60 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
15f70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
15f80 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
15f90 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f       pOther = pO
15fa0 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
15fb0 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65     }.      pInde
15fc0 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65  x->pNext = pOthe
15fd0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
15fe0 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20  pOther->pNext = 
15ff0 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  pIndex;.    }.  
16000 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
16010 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
16020 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
16030 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69  */.exit_create_i
16040 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64  ndex:.  if( pInd
16050 65 78 20 29 7b 0a 20 20 20 20 66 72 65 65 49 6e  ex ){.    freeIn
16060 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d  dex(pIndex);.  }
16070 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
16080 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
16090 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  st);.  sqlite3Sr
160a0 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
160b0 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  pTblName);.  sql
160c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
160d0 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
160e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
160f0 74 65 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65 20  te code to make 
16100 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 66 6f  sure the file fo
16110 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 73 20 61  rmat number is a
16120 74 20 6c 65 61 73 74 20 6d 69 6e 46 6f 72 6d 61  t least minForma
16130 74 2e 0a 2a 2a 20 54 68 65 20 67 65 6e 65 72 61  t..** The genera
16140 74 65 64 20 63 6f 64 65 20 77 69 6c 6c 20 69 6e  ted code will in
16150 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20  crease the file 
16160 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 66  format number if
16170 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 76   necessary..*/.v
16180 6f 69 64 20 73 71 6c 69 74 65 33 4d 69 6e 69 6d  oid sqlite3Minim
16190 75 6d 46 69 6c 65 46 6f 72 6d 61 74 28 50 61 72  umFileFormat(Par
161a0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
161b0 69 44 62 2c 20 69 6e 74 20 6d 69 6e 46 6f 72 6d  iDb, int minForm
161c0 61 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  at){.  Vdbe *v;.
161d0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
161e0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
161f0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69 6e 74  if( v ){.    int
16200 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
16210 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
16220 0a 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71  .    int r2 = sq
16230 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
16240 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 6e 74  pParse);.    int
16250 20 6a 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   j1;.    sqlite3
16260 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16270 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
16280 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 73 71  , r1, 1);.    sq
16290 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
162a0 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
162b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
162c0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
162d0 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 72 32 29 3b   minFormat, r2);
162e0 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  .    j1 = sqlite
162f0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16300 50 5f 47 65 2c 20 72 32 2c 20 30 2c 20 72 31 29  P_Ge, r2, 0, r1)
16310 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16320 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
16330 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 2c  tCookie, iDb, 1,
16340 20 72 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   r2);.    sqlite
16350 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
16360 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   j1);.    sqlite
16370 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
16380 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
16390 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
163a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
163b0 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  2);.  }.}../*.**
163c0 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e   Fill the Index.
163d0 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79  aiRowEst[] array
163e0 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e   with default in
163f0 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f  formation - info
16400 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  rmation.** to be
16410 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61   used when we ha
16420 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41  ve not run the A
16430 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
16440 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30  **.** aiRowEst[0
16450 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f 20  ] is suppose to 
16460 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
16470 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
16480 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  n the index..** 
16490 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20  Since we do not 
164a0 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69  know, guess 1 mi
164b0 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74  llion.  aiRowEst
164c0 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [1] is an estima
164d0 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d  te of the.** num
164e0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
164f0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61  he table that ma
16500 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
16510 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  ar value of the.
16520 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20  ** first column 
16530 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61  of the index.  a
16540 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e  iRowEst[2] is an
16550 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
16560 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f   number.** of ro
16570 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  ws that match an
16580 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d  y particular com
16590 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68 65  biniation of the
165a0 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73   first 2 columns
165b0 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78  .** of the index
165c0 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
165d0 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73    It must always
165e0 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
165f0 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  t.*.**          
16600 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69   aiRowEst[N]<=ai
16610 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20  RowEst[N-1].**  
16620 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
16630 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70  t[N]>=1.**.** Ap
16640 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77  art from that, w
16650 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f  e have little to
16660 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69   go on besides i
16670 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a  ntuition as to.*
16680 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d  * how aiRowEst[]
16690 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
166a0 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d  alized.  The num
166b0 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68  bers generated h
166c0 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64  ere.** are based
166d0 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75   on typical valu
166e0 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75  es found in actu
166f0 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76  al indices..*/.v
16700 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75  oid sqlite3Defau
16710 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a  ltRowEst(Index *
16720 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pIdx){.  unsigne
16730 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52  d *a = pIdx->aiR
16740 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  owEst;.  int i;.
16750 20 20 61 73 73 65 72 74 28 20 61 21 3d 30 20 29    assert( a!=0 )
16760 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30 30 30  ;.  a[0] = 10000
16770 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64 78  00;.  for(i=pIdx
16780 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 35 3b  ->nColumn; i>=5;
16790 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d 20   i--){.    a[i] 
167a0 3d 20 35 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  = 5;.  }.  while
167b0 28 20 69 3e 3d 31 20 29 7b 0a 20 20 20 20 61 5b  ( i>=1 ){.    a[
167c0 69 5d 20 3d 20 31 31 20 2d 20 69 3b 0a 20 20 20  i] = 11 - i;.   
167d0 20 69 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20   i--;.  }.  if( 
167e0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
167f0 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b  E_None ){.    a[
16800 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d  pIdx->nColumn] =
16810 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
16820 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
16830 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74  ll drop an exist
16840 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  ing named index.
16850 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
16860 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
16870 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74   DROP INDEX stat
16880 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
16890 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28  qlite3DropIndex(
168a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
168b0 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
168c0 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20  nt ifExists){.  
168d0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
168e0 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
168f0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
16900 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
16910 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
16920 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
16930 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
16940 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
16950 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
16960 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
16970 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  =1 );.  if( SQLI
16980 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
16990 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
169a0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
169b0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
169c0 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
169d0 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
169e0 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
169f0 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
16a00 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
16a10 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
16a20 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74      if( !ifExist
16a30 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
16a40 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
16a50 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
16a60 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30  x: %S", pName, 0
16a70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
16a80 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
16a90 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 1;.    goto e
16aa0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
16ab0 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
16ac0 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20  ->autoIndex ){. 
16ad0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
16ae0 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
16af0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
16b00 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20  h UNIQUE ".     
16b10 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   "or PRIMARY KEY
16b20 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e   constraint cann
16b30 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
16b40 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  0);.    goto exi
16b50 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
16b60 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
16b70 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
16b80 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
16b90 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ma);.#ifndef SQL
16ba0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
16bb0 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
16bc0 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
16bd0 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
16be0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
16bf0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
16c00 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
16c10 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
16c20 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
16c30 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
16c40 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
16c50 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
16c60 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
16c70 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
16c80 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
16c90 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
16ca0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
16cb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f      }.    if( !O
16cc0 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
16cd0 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  b ) code = SQLIT
16ce0 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
16cf0 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
16d00 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
16d10 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78  se, code, pIndex
16d20 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
16d30 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
16d40 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
16d50 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
16d60 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
16d70 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
16d80 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  o remove the ind
16d90 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20  ex and from the 
16da0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
16db0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
16dc0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
16dd0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
16de0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
16df0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
16e00 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
16e10 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
16e20 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22  pParse,.       "
16e30 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
16e40 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  s WHERE name=%Q"
16e50 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ,.       db->aDb
16e60 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
16e70 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
16e80 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
16e90 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
16ea0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
16eb0 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65  able(db, "sqlite
16ec0 5f 73 74 61 74 31 22 2c 20 64 62 2d 3e 61 44 62  _stat1", db->aDb
16ed0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a  [iDb].zName) ){.
16ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
16ef0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
16f00 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
16f10 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f   FROM %Q.sqlite_
16f20 73 74 61 74 31 20 57 48 45 52 45 20 69 64 78 3d  stat1 WHERE idx=
16f30 25 51 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d  %Q",.        db-
16f40 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
16f50 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20   pIndex->zName. 
16f60 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
16f70 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
16f80 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
16f90 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  b);.    destroyR
16fa0 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
16fb0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44  pIndex->tnum, iD
16fc0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
16fd0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
16fe0 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20  DropIndex, iDb, 
16ff0 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  0, 0, pIndex->zN
17000 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78  ame, 0);.  }..ex
17010 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20  it_drop_index:. 
17020 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
17030 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29  elete(db, pName)
17040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61  ;.}../*.** pArra
17050 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
17060 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62  o an array of ob
17070 6a 65 63 74 73 2e 20 20 45 61 63 68 20 6f 62 6a  jects.  Each obj
17080 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ect in the.** ar
17090 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62  ray is szEntry b
170a0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 20 54  ytes in size.  T
170b0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
170c0 63 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6f  cates a new.** o
170d0 62 6a 65 63 74 20 6f 6e 20 74 68 65 20 65 6e 64  bject on the end
170e0 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e 0a 2a   of the array..*
170f0 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79 20 69 73  *.** *pnEntry is
17100 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
17110 6e 74 72 69 65 73 20 61 6c 72 65 61 64 79 20 69  ntries already i
17120 6e 20 75 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63  n use.  *pnAlloc
17130 20 69 73 0a 2a 2a 20 74 68 65 20 70 72 65 76 69   is.** the previ
17140 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
17150 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61  size of the arra
17160 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20  y.  initSize is 
17170 74 68 65 0a 2a 2a 20 73 75 67 67 65 73 74 65 64  the.** suggested
17180 20 69 6e 69 74 69 61 6c 20 61 72 72 61 79 20 73   initial array s
17190 69 7a 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a  ize allocation..
171a0 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  **.** The index 
171b0 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  of the new entry
171c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20   is returned in 
171d0 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  *pIdx..**.** Thi
171e0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
171f0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
17200 68 65 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65  he array of obje
17210 63 74 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 69  cts.  This.** mi
17220 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ght be the same 
17230 61 73 20 74 68 65 20 70 41 72 72 61 79 20 70 61  as the pArray pa
17240 72 61 6d 65 74 65 72 20 6f 72 20 69 74 20 6d 69  rameter or it mi
17250 67 68 74 20 62 65 20 61 20 64 69 66 66 65 72 65  ght be a differe
17260 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 66  nt.** pointer if
17270 20 74 68 65 20 61 72 72 61 79 20 77 61 73 20 72   the array was r
17280 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  esized..*/.void 
17290 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c  *sqlite3ArrayAll
172a0 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33  ocate(.  sqlite3
172b0 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f   *db,      /* Co
172c0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
172d0 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69  fy of malloc fai
172e0 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  lures */.  void 
172f0 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20  *pArray,     /* 
17300 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  Array of objects
17310 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c  .  Might be real
17320 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  located */.  int
17330 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f   szEntry,      /
17340 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f  * Size of each o
17350 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72 72  bject in the arr
17360 61 79 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 69 74  ay */.  int init
17370 53 69 7a 65 2c 20 20 20 20 20 2f 2a 20 53 75 67  Size,     /* Sug
17380 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c 20 61  gested initial a
17390 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c  llocation, in el
173a0 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ements */.  int 
173b0 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a  *pnEntry,     /*
173c0 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   Number of objec
173d0 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  ts currently in 
173e0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  use */.  int *pn
173f0 41 6c 6c 6f 63 2c 20 20 20 20 20 2f 2a 20 43 75  Alloc,     /* Cu
17400 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
17410 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e  e allocation, in
17420 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   elements */.  i
17430 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  nt *pIdx        
17440 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e   /* Write the in
17450 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f  dex of a new slo
17460 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63  t here */.){.  c
17470 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 2a 70  har *z;.  if( *p
17480 6e 45 6e 74 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c  nEntry >= *pnAll
17490 6f 63 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  oc ){.    void *
174a0 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65  pNew;.    int ne
174b0 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69  wSize;.    newSi
174c0 7a 65 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a  ze = (*pnAlloc)*
174d0 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20  2 + initSize;.  
174e0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
174f0 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41  DbRealloc(db, pA
17500 72 72 61 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a  rray, newSize*sz
17510 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20  Entry);.    if( 
17520 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
17530 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20   *pIdx = -1;.   
17540 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79     return pArray
17550 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 41  ;.    }.    *pnA
17560 6c 6c 6f 63 20 3d 20 6e 65 77 53 69 7a 65 3b 0a  lloc = newSize;.
17570 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65      pArray = pNe
17580 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68  w;.  }.  z = (ch
17590 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65  ar*)pArray;.  me
175a0 6d 73 65 74 28 26 7a 5b 2a 70 6e 45 6e 74 72 79  mset(&z[*pnEntry
175b0 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20   * szEntry], 0, 
175c0 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64  szEntry);.  *pId
175d0 78 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20  x = *pnEntry;.  
175e0 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65  ++*pnEntry;.  re
175f0 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a  turn pArray;.}..
17600 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
17610 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
17620 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
17630 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
17640 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
17650 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
17660 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
17670 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
17680 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
17690 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
176a0 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71  3IdListAppend(sq
176b0 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
176c0 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
176d0 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20  *pToken){.  int 
176e0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
176f0 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
17700 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
17710 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
17720 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
17730 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
17740 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
17750 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20  t->nAlloc = 0;. 
17760 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20   }.  pList->a = 
17770 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
17780 63 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a  cate(.      db,.
17790 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a        pList->a,.
177a0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69        sizeof(pLi
177b0 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20  st->a[0]),.     
177c0 20 35 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74   5,.      &pList
177d0 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 70 4c  ->nId,.      &pL
177e0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20  ist->nAlloc,.   
177f0 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28     &i.  );.  if(
17800 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69   i<0 ){.    sqli
17810 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
17820 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
17830 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
17840 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
17850 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
17860 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
17870 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ken);.  return p
17880 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  List;.}../*.** D
17890 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e  elete an IdList.
178a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
178b0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c  IdListDelete(sql
178c0 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
178d0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
178e0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
178f0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
17900 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
17910 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
17920 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
17930 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
17940 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
17950 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
17960 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
17970 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
17980 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
17990 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e  urn the index in
179a0 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64   pList of the id
179b0 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a  entifier named z
179c0 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a  Id.  Return -1.*
179d0 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  * if not found..
179e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64  */.int sqlite3Id
179f0 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74  ListIndex(IdList
17a00 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63   *pList, const c
17a10 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
17a20 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
17a30 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31  t==0 ) return -1
17a40 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
17a50 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
17a60 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
17a70 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
17a80 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [i].zName, zName
17a90 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
17aa0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
17ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
17ac0 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  d a new table na
17ad0 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  me to the given 
17ae0 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65  SrcList.  Create
17af0 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
17b00 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41  f.** need be.  A
17b10 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72   new entry is cr
17b20 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63  eated in the Src
17b30 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f  List even if pTo
17b40 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  ken is NULL..**.
17b50 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74  ** A new SrcList
17b60 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
17b70 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
17b80 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  ) fails..**.** I
17b90 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e  f pDatabase is n
17ba0 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e  ot null, it mean
17bb0 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  s that the table
17bc0 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   has an optional
17bd0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d  .** database nam
17be0 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20  e prefix.  Like 
17bf0 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65  this:  "database
17c00 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44  .table".  The pD
17c10 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74  atabase.** point
17c20 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e  s to the table n
17c30 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62  ame and the pTab
17c40 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  le points to the
17c50 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
17c60 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61  ** The SrcList.a
17c70 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69  [].zName field i
17c80 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
17c90 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69  e table name whi
17ca0 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65  ch might.** come
17cb0 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66   from pTable (if
17cc0 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
17cd0 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74  LL) or from pDat
17ce0 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c  abase.  .** SrcL
17cf0 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73  ist.a[].zDatabas
17d00 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  e is filled with
17d10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
17d20 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a  me from pTable,.
17d30 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20  ** or with NULL 
17d40 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69  if no database i
17d50 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  s specified..**.
17d60 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
17d70 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20  s, if call like 
17d80 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
17d90 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
17da0 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30  stAppend(D,A,B,0
17db0 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20  );.**.** Then B 
17dc0 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20  is a table name 
17dd0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
17de0 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69   name is unspeci
17df0 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64  fied.  If called
17e00 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  .** like this:.*
17e10 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
17e20 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
17e30 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a  d(D,A,B,C);.**.*
17e40 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20  * Then C is the 
17e50 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42  table name and B
17e60 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
17e70 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73   name..*/.SrcLis
17e80 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
17e90 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74  tAppend(.  sqlit
17ea0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
17eb0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * Connection to 
17ec0 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63  notify of malloc
17ed0 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53   failures */.  S
17ee0 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  rcList *pList,  
17ef0 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20     /* Append to 
17f00 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55  this SrcList. NU
17f10 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  LL creates a new
17f20 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f   SrcList */.  To
17f30 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20  ken *pTable,    
17f40 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70    /* Table to ap
17f50 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  pend */.  Token 
17f60 2a 70 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a  *pDatabase    /*
17f70 20 44 61 74 61 62 61 73 65 20 6f 66 20 74 68 65   Database of the
17f80 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73   table */.){.  s
17f90 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
17fa0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
17fb0 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
17fc0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
17fd0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
17fe0 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29   sizeof(SrcList)
17ff0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
18000 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
18010 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
18020 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  oc = 1;.  }.  if
18030 28 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70  ( pList->nSrc>=p
18040 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  List->nAlloc ){.
18050 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65      SrcList *pNe
18060 77 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  w;.    pList->nA
18070 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70  lloc *= 2;.    p
18080 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
18090 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74  ealloc(db, pList
180a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
180b0 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20   sizeof(*pList) 
180c0 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  + (pList->nAlloc
180d0 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  -1)*sizeof(pList
180e0 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
180f0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
18100 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
18110 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
18120 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
18130 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
18140 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
18150 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
18160 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
18170 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65  ];.  memset(pIte
18180 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69  m, 0, sizeof(pLi
18190 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66  st->a[0]));.  if
181a0 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
181b0 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29  Database->z==0 )
181c0 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  {.    pDatabase 
181d0 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
181e0 44 61 74 61 62 61 73 65 20 26 26 20 70 54 61 62  Database && pTab
181f0 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  le ){.    Token 
18200 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61  *pTemp = pDataba
18210 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73  se;.    pDatabas
18220 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20  e = pTable;.    
18230 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a  pTable = pTemp;.
18240 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61    }.  pItem->zNa
18250 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
18260 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
18270 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  able);.  pItem->
18280 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
18290 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
182a0 28 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b  (db, pDatabase);
182b0 0a 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  .  pItem->iCurso
182c0 72 20 3d 20 2d 31 3b 0a 20 20 70 4c 69 73 74 2d  r = -1;.  pList-
182d0 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72  >nSrc++;.  retur
182e0 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
182f0 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73  * Assign cursors
18300 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   to all tables i
18310 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76  n a SrcList.*/.v
18320 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
18330 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
18340 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
18350 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
18360 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
18370 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
18380 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
18390 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d  pList || pParse-
183a0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
183b0 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  d );.  if( pList
183c0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c   ){.    for(i=0,
183d0 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
183e0 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
183f0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
18400 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
18410 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65  iCursor>=0 ) bre
18420 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ak;.      pItem-
18430 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  >iCursor = pPars
18440 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
18450 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
18460 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
18470 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
18480 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
18490 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
184a0 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20  t->pSrc);.      
184b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
184c0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
184d0 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e  ntire SrcList in
184e0 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20  cluding all its 
184f0 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  substructure..*/
18500 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
18510 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
18520 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
18530 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
18540 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
18550 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
18560 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
18570 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
18580 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
18590 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
185a0 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
185b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
185c0 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
185d0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73  Database);.    s
185e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
185f0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
18600 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
18610 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  e(db, pItem->zAl
18620 69 61 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ias);.    sqlite
18630 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
18640 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20  m->zIndex);.    
18650 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
18660 6c 65 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  le(pItem->pTab);
18670 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
18680 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  ctDelete(db, pIt
18690 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
186a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
186b0 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
186c0 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
186d0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
186e0 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b   pItem->pUsing);
186f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
18700 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
18710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
18720 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
18730 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74   by the parser t
18740 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d  o add a new term
18750 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
18760 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d  f a growing FROM
18770 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70   clause.  The "p
18780 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  " parameter is t
18790 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  he part of.** th
187a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68  e FROM clause th
187b0 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
187c0 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  een constructed.
187d0 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a    "p" is NULL.**
187e0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
187f0 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68  first term of th
18800 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
18810 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61  pTable and pData
18820 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  base.** are the 
18830 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
18840 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e  e and database n
18850 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
18860 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a   clause term..**
18870 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
18880 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  LL if the databa
18890 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65  se name qualifie
188a0 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74  r is missing - t
188b0 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65  he.** usual case
188c0 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68  .  If the term h
188d0 61 73 20 61 20 61 6c 69 61 73 2c 20 74 68 65 6e  as a alias, then
188e0 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74   pAlias points t
188f0 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74  o the.** alias t
18900 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65  oken.  If the te
18910 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  rm is a subquery
18920 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79  , then pSubquery
18930 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   is the.** SELEC
18940 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
18950 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e   the subquery en
18960 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62  codes.  The pTab
18970 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62  le and.** pDatab
18980 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61  ase parameters a
18990 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71  re NULL for subq
189a0 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e  ueries.  The pOn
189b0 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70   and pUsing.** p
189c0 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68  arameters are th
189d0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
189e0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
189f0 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  auses..**.** Ret
18a00 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73  urn a new SrcLis
18a10 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20  t which encodes 
18a20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68  is the FROM with
18a30 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d   the new.** term
18a40 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69   added..*/.SrcLi
18a50 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
18a60 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
18a70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
18a80 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
18a90 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
18aa0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  /.  SrcList *p, 
18ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18ac0 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20  he left part of 
18ad0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
18ae0 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a  already seen */.
18af0 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
18b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
18b10 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
18b20 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f  o add to the FRO
18b30 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f  M clause */.  To
18b40 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20  ken *pDatabase, 
18b50 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
18b60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
18b70 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20  ntaining pTable 
18b80 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69  */.  Token *pAli
18b90 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  as,          /* 
18ba0 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
18bb0 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75  ide of the AS su
18bc0 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
18bd0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65   Select *pSubque
18be0 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75  ry,      /* A su
18bf0 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70  bquery used in p
18c00 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20  lace of a table 
18c10 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
18c20 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pOn,            
18c30 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75    /* The ON clau
18c40 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a  se of a join */.
18c50 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67    IdList *pUsing
18c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18c70 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
18c80 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20   a join */.){.  
18c90 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
18ca0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
18cb0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
18cc0 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 73 71  se->db;.  p = sq
18cd0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
18ce0 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65  nd(db, p, pTable
18cf0 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
18d00 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e  if( p==0 || p->n
18d10 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Src==0 ){.    sq
18d20 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
18d30 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 20 20 73 71  db, pOn);.    sq
18d40 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
18d50 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20  e(db, pUsing);. 
18d60 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
18d70 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71  Delete(db, pSubq
18d80 75 65 72 79 29 3b 0a 20 20 20 20 72 65 74 75 72  uery);.    retur
18d90 6e 20 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  n p;.  }.  pItem
18da0 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
18db0 2d 31 5d 3b 0a 20 20 69 66 28 20 70 41 6c 69 61  -1];.  if( pAlia
18dc0 73 20 26 26 20 70 41 6c 69 61 73 2d 3e 6e 20 29  s && pAlias->n )
18dd0 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c  {.    pItem->zAl
18de0 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ias = sqlite3Nam
18df0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
18e00 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49  Alias);.  }.  pI
18e10 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70  tem->pSelect = p
18e20 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65  Subquery;.  pIte
18e30 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20  m->pOn = pOn;.  
18e40 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  pItem->pUsing = 
18e50 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e  pUsing;.  return
18e60 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   p;.}../*.** Add
18e70 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f   an INDEXED BY o
18e80 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  r NOT INDEXED cl
18e90 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74  ause to the most
18ea0 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
18eb0 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  .** element of t
18ec0 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70  he source-list p
18ed0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
18ee0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
18ef0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
18f00 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50 61  ListIndexedBy(Pa
18f10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
18f20 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a  List *p, Token *
18f30 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 69  pIndexedBy){.  i
18f40 66 28 20 70 49 6e 64 65 78 65 64 42 79 20 26 26  f( pIndexedBy &&
18f50 20 70 20 26 26 20 70 2d 3e 6e 53 72 63 3e 30 20   p && p->nSrc>0 
18f60 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
18f70 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
18f80 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72  m = &p->a[p->nSr
18f90 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  c-1];.    assert
18fa0 28 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65  ( pItem->notInde
18fb0 78 65 64 3d 3d 30 20 26 26 20 70 49 74 65 6d 2d  xed==0 && pItem-
18fc0 3e 7a 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20  >zIndex==0 );.  
18fd0 20 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79    if( pIndexedBy
18fe0 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65  ->n==1 && !pInde
18ff0 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20  xedBy->z ){.    
19000 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45    /* A "NOT INDE
19010 58 45 44 22 20 63 6c 61 75 73 65 20 77 61 73 20  XED" clause was 
19020 73 75 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61  supplied. See pa
19030 72 73 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20  rse.y .      ** 
19040 63 6f 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78  construct "index
19050 65 64 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61  ed_opt" for deta
19060 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49  ils. */.      pI
19070 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20  tem->notIndexed 
19080 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
19090 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 49 6e        pItem->zIn
190a0 64 65 78 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  dex = sqlite3Nam
190b0 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
190c0 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42  e->db, pIndexedB
190d0 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  y);.    }.  }.}.
190e0 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c  ./*.** When buil
190f0 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63  ding up a FROM c
19100 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70 61 72  lause in the par
19110 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ser, the join op
19120 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69  erator.** is ini
19130 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20  tially attached 
19140 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  to the left oper
19150 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f  and.  But the co
19160 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
19170 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e  expects the join
19180 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
19190 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  on the right ope
191a0 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
191b0 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c  ine.** Shifts al
191c0 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73  l join operators
191d0 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
191e0 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72  ght for an entir
191f0 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65  e FROM.** clause
19200 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a  ..**.** Example:
19210 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69   Suppose the joi
19220 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  n is like this:.
19230 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
19240 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20  A natural cross 
19250 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65  join B.**.** The
19260 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61   operator is "na
19270 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e  tural cross join
19280 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42 20  ".  The A and B 
19290 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f  operands are sto
192a0 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30  red.** in p->a[0
192b0 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72  ] and p->a[1], r
192c0 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68  espectively.  Th
192d0 65 20 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c  e parser initial
192e0 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a  ly stores the.**
192f0 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 41   operator with A
19300 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
19310 73 68 69 66 74 73 20 74 68 61 74 20 6f 70 65 72  shifts that oper
19320 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a  ator over to B..
19330 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
19340 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54  rcListShiftJoinT
19350 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b  ype(SrcList *p){
19360 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61  .  if( p && p->a
19370 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
19380 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63     for(i=p->nSrc
19390 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
193a0 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69       p->a[i].joi
193b0 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31  ntype = p->a[i-1
193c0 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ].jointype;.    
193d0 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f  }.    p->a[0].jo
193e0 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a  intype = 0;.  }.
193f0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
19400 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
19410 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
19420 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  nTransaction(Par
19430 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
19440 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  type){.  sqlite3
19450 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
19460 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
19470 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
19480 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
19490 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
194a0 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
194b0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
194c0 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
194d0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
194e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
194f0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
19500 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
19510 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  ON, "BEGIN", 0, 
19520 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
19530 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
19540 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
19550 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !v ) return;. 
19560 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45   if( type!=TK_DE
19570 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f  FERRED ){.    fo
19580 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
19590 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
195a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
195b0 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
195c0 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f  n, i, (type==TK_
195d0 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20  EXCLUSIVE)+1);. 
195e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
195f0 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b  UsesBtree(v, i);
19600 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
19610 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19620 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
19630 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 0);.}../*.**
19640 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61   Commit a transa
19650 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
19660 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73  lite3CommitTrans
19670 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
19680 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
19690 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
196a0 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
196b0 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
196c0 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
196d0 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
196e0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
196f0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
19700 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
19710 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
19720 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
19730 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
19740 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d  ANSACTION, "COMM
19750 49 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IT", 0, 0) ) ret
19760 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
19770 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
19780 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
19790 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
197a0 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
197b0 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20  ommit, 1, 0);.  
197c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  }.}../*.** Rollb
197d0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
197e0 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
197f0 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63  3RollbackTransac
19800 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
19810 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
19820 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
19830 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
19840 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
19850 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
19860 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
19870 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
19880 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
19890 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
198a0 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
198b0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
198c0 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
198d0 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
198e0 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  CK", 0, 0) ) ret
198f0 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
19900 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
19910 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
19920 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19930 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
19940 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20  ommit, 1, 1);.  
19950 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
19960 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  sure the TEMP da
19970 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61  tabase is open a
19980 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  nd available for
19990 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a   use.  Return.**
199a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
199b0 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e  rrors.  Leave an
199c0 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
199d0 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
199e0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
199f0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
19a00 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a  Database(Parse *
19a10 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
19a20 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
19a30 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  >db;.  if( db->a
19a40 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20  Db[1].pBt==0 && 
19a50 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
19a60 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
19a70 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
19a80 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20   int flags = .  
19a90 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
19aa0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a  PEN_READWRITE |.
19ab0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
19ac0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
19ad0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
19ae0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
19af0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
19b00 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
19b10 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
19b20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
19b30 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20  P_DB;..    rc = 
19b40 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74  sqlite3BtreeFact
19b50 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 53 51  ory(db, 0, 0, SQ
19b60 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
19b70 48 45 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 0a  HE_SIZE, flags,.
19b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ba0 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74   &db->aDb[1].pBt
19bb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
19bc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19bd0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19be0 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
19bf0 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
19c00 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
19c10 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
19c20 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
19c30 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
19c40 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
19c50 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
19c60 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
19c70 61 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c 61  assert( (db->fla
19c80 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
19c90 61 6e 73 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  ans)==0 || db->a
19ca0 75 74 6f 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 20  utoCommit );.   
19cb0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
19cc0 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
19cd0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a     sqlite3PagerJ
19ce0 6f 75 72 6e 61 6c 4d 6f 64 65 28 73 71 6c 69 74  ournalMode(sqlit
19cf0 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d  e3BtreePager(db-
19d00 3e 61 44 62 5b 31 5d 2e 70 42 74 29 2c 0a 20 20  >aDb[1].pBt),.  
19d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 64 66            db->df
19d30 6c 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 29 3b 0a  ltJournalMode);.
19d40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
19d50 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
19d60 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
19d70 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65   will verify the
19d80 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61   schema cookie a
19d90 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65  nd start.** a re
19da0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ad-transaction f
19db0 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74  or all named dat
19dc0 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a  abase files..**.
19dd0 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  ** It is importa
19de0 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65  nt that all sche
19df0 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65  ma cookies be ve
19e00 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a  rified and all.*
19e10 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  * read transacti
19e20 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62  ons be started b
19e30 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65  efore anything e
19e40 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a  lse happens in.*
19e50 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  * the VDBE progr
19e60 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f  am.  But this ro
19e70 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c  utine can be cal
19e80 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f  led after much o
19e90 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73  ther.** code has
19ea0 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e   been generated.
19eb0 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61    So here is wha
19ec0 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54  t we do:.**.** T
19ed0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
19ee0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
19ef0 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e  lled, we code an
19f00 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a   OP_Goto that.**
19f10 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20   will jump to a 
19f20 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68  subroutine at th
19f30 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f  e end of the pro
19f40 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a  gram.  Then we.*
19f50 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64  * record every d
19f60 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65  atabase that nee
19f70 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65  ds its schema ve
19f80 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  rified in the.**
19f90 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
19fa0 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65  ask field.  Late
19fb0 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68  r, after all oth
19fc0 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  er code has been
19fd0 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74  .** generated, t
19fe0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  he subroutine th
19ff0 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b  at does the cook
1a000 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73  ie verifications
1a010 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74   and.** starts t
1a020 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  he transactions 
1a030 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e  will be coded an
1a040 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32  d the OP_Goto P2
1a050 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
1a060 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
1a070 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74 69  to that subrouti
1a080 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74  ne.  The generat
1a090 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ion of the.** co
1a0a0 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f  okie verificatio
1a0b0 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64  n subroutine cod
1a0c0 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c  e happens in sql
1a0d0 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67  ite3FinishCoding
1a0e0 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  ()..**.** If iDb
1a0f0 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65  <0 then code the
1a100 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20   OP_Goto only - 
1a110 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74  don't set flag t
1a120 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20  o verify the.** 
1a130 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61  schema on any da
1a140 74 61 62 61 73 65 73 2e 20 20 54 68 69 73 20 63  tabases.  This c
1a150 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f  an be used to po
1a160 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f  sition the OP_Go
1a170 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74  to.** early in t
1a180 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20  he code, before 
1a190 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64  we know if any d
1a1a0 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 20 77  atabase tables w
1a1b0 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a  ill be used..*/.
1a1c0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
1a1d0 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72  VerifySchema(Par
1a1e0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1a1f0 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  iDb){.  sqlite3 
1a200 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
1a210 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76    int mask;..  v
1a220 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1a230 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1a240 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20   v==0 ) return; 
1a250 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
1a260 70 70 65 6e 73 20 69 66 20 74 68 65 72 65 20 77  ppens if there w
1a270 61 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72  as a prior error
1a280 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
1a290 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61  e->db;.  if( pPa
1a2a0 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d  rse->cookieGoto=
1a2b0 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  =0 ){.    pParse
1a2c0 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73  ->cookieGoto = s
1a2d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a2e0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1a2f0 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0)+1;.  }.  if( 
1a300 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73  iDb>=0 ){.    as
1a310 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
1a320 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
1a330 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
1a340 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
1a350 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
1a360 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  b<SQLITE_MAX_ATT
1a370 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20 20 6d  ACHED+2 );.    m
1a380 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20  ask = 1<<iDb;.  
1a390 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 63    if( (pParse->c
1a3a0 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b  ookieMask & mask
1a3b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  )==0 ){.      pP
1a3c0 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
1a3d0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
1a3e0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61  pParse->cookieVa
1a3f0 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61  lue[iDb] = db->a
1a400 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
1a410 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a  >schema_cookie;.
1a420 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
1a430 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
1a440 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1a450 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
1a460 61 73 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ase(pParse);.   
1a470 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1a480 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1a490 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
1a4a0 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69  prepares for doi
1a4b0 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ng an operation 
1a4c0 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
1a4d0 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73  ange the databas
1a4e0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1a4f0 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e  utine starts a n
1a500 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ew transaction i
1a510 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
1a520 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61  eady within.** a
1a530 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
1a540 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
1a550 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
1a560 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68  ction, then a ch
1a570 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73  eckpoint.** is s
1a580 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61  et if the setSta
1a590 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72  tement parameter
1a5a0 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65   is true.  A che
1a5b0 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a  ckpoint should.*
1a5c0 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65  * be set for ope
1a5d0 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  rations that mig
1a5e0 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20  ht fail (due to 
1a5f0 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61  a constraint) pa
1a600 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79  rt of.** the way
1a610 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69   through and whi
1a620 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ch will need to 
1a630 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73  undo some writes
1a640 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
1a650 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  to.** rollback t
1a660 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63  he whole transac
1a670 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61  tion.  For opera
1a680 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20  tions where all 
1a690 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63  constraints.** c
1a6a0 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65  an be checked be
1a6b0 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
1a6c0 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
1a6d0 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73   database, it is
1a6e0 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73   never.** necess
1a6f0 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72  ary to undo a wr
1a700 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63  ite and the chec
1a710 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f  kpoint should no
1a720 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  t be set..**.** 
1a730 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 69 44  Only database iD
1a740 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64  b and the temp d
1a750 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65  atabase are made
1a760 20 77 72 69 74 61 62 6c 65 20 62 79 20 74 68 69   writable by thi
1a770 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44  s call..** If iD
1a780 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 6d  b==0, then the m
1a790 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64 61 74  ain and temp dat
1a7a0 61 62 61 73 65 73 20 61 72 65 20 6d 61 64 65 20  abases are made 
1a7b0 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a  writable.   If.*
1a7c0 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e  * iDb==1 then on
1a7d0 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ly the temp data
1a7e0 62 61 73 65 20 69 73 20 6d 61 64 65 20 77 72 69  base is made wri
1a7f0 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62 3e 31  table.  If iDb>1
1a800 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65   then the.** spe
1a810 63 69 66 69 65 64 20 61 75 78 69 6c 69 61 72 79  cified auxiliary
1a820 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
1a830 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
1a840 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c  are made writabl
1a850 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1a860 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1a870 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
1a880 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74  rse, int setStat
1a890 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b  ement, int iDb){
1a8a0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
1a8b0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1a8c0 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
1a8d0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1a8e0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
1a8f0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
1a900 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77 72 69 74  ;.  pParse->writ
1a910 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b  eMask |= 1<<iDb;
1a920 0a 20 20 69 66 28 20 73 65 74 53 74 61 74 65 6d  .  if( setStatem
1a930 65 6e 74 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ent && pParse->n
1a940 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ested==0 ){.    
1a950 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a960 31 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e  1(v, OP_Statemen
1a970 74 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 69  t, iDb);.  }.  i
1a980 66 28 20 28 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( (OMIT_TEMPDB 
1a990 7c 7c 20 69 44 62 21 3d 31 29 20 26 26 20 70 50  || iDb!=1) && pP
1a9a0 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d  arse->db->aDb[1]
1a9b0 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 73  .pBt!=0 ){.    s
1a9c0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1a9d0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1a9e0 2c 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  , setStatement, 
1a9f0 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
1aa00 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1aa10 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65   pIndex uses the
1aa20 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1aa30 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75  nce pColl.  Retu
1aa40 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74  rn.** true if it
1aa50 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20   does and false 
1aa60 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
1aa70 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1aa80 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
1aa90 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74  tatic int collat
1aaa0 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63  ionMatch(const c
1aab0 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65  har *zColl, Inde
1aac0 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e  x *pIndex){.  in
1aad0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1aae0 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  i<pIndex->nColum
1aaf0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  n; i++){.    con
1ab00 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e  st char *z = pIn
1ab10 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  dex->azColl[i];.
1ab20 20 20 20 20 69 66 28 20 7a 3d 3d 7a 43 6f 6c 6c      if( z==zColl
1ab30 20 7c 7c 20 28 7a 20 26 26 20 7a 43 6f 6c 6c 20   || (z && zColl 
1ab40 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
1ab50 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 29 20  ICmp(z, zColl)) 
1ab60 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1ab70 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
1ab80 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1ab90 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
1aba0 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
1abb0 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20  f pTab that use 
1abc0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
1abd0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a  quence pColl..**
1abe0 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
1abf0 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  n recompute all 
1ac00 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e  indices of pTab.
1ac10 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1ac20 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
1ac30 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
1ac40 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a  dexTable(Parse *
1ac50 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
1ac60 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  Tab, char const 
1ac70 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78  *zColl){.  Index
1ac80 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
1ac90 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
1aca0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
1acb0 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f  th pTab */..  fo
1acc0 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70  r(pIndex=pTab->p
1acd0 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
1ace0 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e  Index=pIndex->pN
1acf0 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43  ext){.    if( zC
1ad00 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74  oll==0 || collat
1ad10 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20  ionMatch(zColl, 
1ad20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20  pIndex) ){.     
1ad30 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
1ad40 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
1ad50 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
1ad60 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
1ad70 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
1ad80 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1ad90 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
1ada0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
1adb0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
1adc0 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
1add0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
1ade0 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
1adf0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61  all indices of a
1ae00 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c  ll tables in all
1ae10 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65   databases where
1ae20 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20   the.** indices 
1ae30 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
1ae40 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
1ae50 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  .  If pColl==0 t
1ae60 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a  hen recompute.**
1ae70 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65   all indices eve
1ae80 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e  rywhere..*/.#ifn
1ae90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1aea0 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
1aeb0 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62  oid reindexDatab
1aec0 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ases(Parse *pPar
1aed0 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  se, char const *
1aee0 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44  zColl){.  Db *pD
1aef0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1af00 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
1af10 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
1af20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
1af30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1af40 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
1af50 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
1af60 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1af70 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
1af80 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1af90 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c  tion */.  HashEl
1afa0 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
1afb0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1afc0 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
1afd0 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62   in pDb */.  Tab
1afe0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
1aff0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
1b000 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
1b010 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44  ase */..  for(iD
1b020 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62  b=0, pDb=db->aDb
1b030 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
1b040 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20  Db++, pDb++){.  
1b050 20 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30    assert( pDb!=0
1b060 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71   );.    for(k=sq
1b070 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
1b080 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
1b090 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c  Hash);  k; k=sql
1b0a0 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b  iteHashNext(k)){
1b0b0 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54  .      pTab = (T
1b0c0 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
1b0d0 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72  Data(k);.      r
1b0e0 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
1b0f0 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29  se, pTab, zColl)
1b100 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
1b110 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
1b120 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
1b130 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  e REINDEX comman
1b140 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  d..**.**        
1b150 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20  REINDEX         
1b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b170 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20     -- 1.**      
1b180 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c    REINDEX  <coll
1b190 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20  ation>          
1b1a0 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20       -- 2.**    
1b1b0 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
1b1c0 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65  atabase>.?<table
1b1d0 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20  name>  -- 3.**  
1b1e0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
1b1f0 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64  <database>.?<ind
1b200 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a  exname>  -- 4.**
1b210 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65  .** Form 1 cause
1b220 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
1b230 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
1b240 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65  tabases to be re
1b250 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32  built..** Form 2
1b260 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e   rebuilds all in
1b270 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  dices in all dat
1b280 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20  abases that use 
1b290 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c  the named.** col
1b2a0 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  lating function.
1b2b0 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20    Forms 3 and 4 
1b2c0 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65  rebuild the name
1b2d0 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a  d index or all.*
1b2e0 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  * indices associ
1b2f0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
1b300 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69  med table..*/.#i
1b310 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b320 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73  T_REINDEX.void s
1b330 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61  qlite3Reindex(Pa
1b340 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
1b350 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65  en *pName1, Toke
1b360 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f  n *pName2){.  Co
1b370 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
1b380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
1b390 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1b3a0 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c  to be reindexed,
1b3b0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68   or NULL */.  ch
1b3c0 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
1b3d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1b3e0 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
1b3f0 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74  index */.  const
1b400 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20   char *zDb;     
1b410 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1b420 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
1b430 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
1b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b450 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
1b460 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
1b470 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
1b480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1b490 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
1b4a0 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
1b4b0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b4d0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
1b4e0 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
1b4f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1b500 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
1b510 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1b520 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ection */.  Toke
1b530 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20  n *pObjName;    
1b540 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1b550 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1b560 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e  index to be rein
1b570 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52  dexed */..  /* R
1b580 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
1b590 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
1b5a0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
1b5b0 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
1b5c0 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
1b5d0 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
1b5e0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
1b5f0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1b600 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
1b610 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
1b620 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
1b630 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 7c   if( pName1==0 |
1b640 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29  | pName1->z==0 )
1b650 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74  {.    reindexDat
1b660 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30  abases(pParse, 0
1b670 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1b680 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65   }else if( pName
1b690 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e  2==0 || pName2->
1b6a0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  z==0 ){.    char
1b6b0 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73   *zColl;.    ass
1b6c0 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29  ert( pName1->z )
1b6d0 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71  ;.    zColl = sq
1b6e0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1b6f0 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
1b700 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
1b710 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
1b720 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1b730 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
1b740 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
1b750 6c 6c 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20  ll, -1, 0);.    
1b760 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
1b770 20 20 20 69 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a     if( zColl ){.
1b780 20 20 20 20 20 20 20 20 72 65 69 6e 64 65 78 44          reindexD
1b790 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
1b7a0 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20   zColl);.       
1b7b0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1b7c0 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  b, zColl);.     
1b7d0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b   }.      return;
1b7e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1b7f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
1b800 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  ll);.  }.  iDb =
1b810 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
1b820 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
1b830 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62  e1, pName2, &pOb
1b840 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  jName);.  if( iD
1b850 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
1b860 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
1b870 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62  romToken(db, pOb
1b880 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d  jName);.  if( z=
1b890 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  =0 ) return;.  z
1b8a0 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
1b8b0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20  ].zName;.  pTab 
1b8c0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
1b8d0 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  le(db, z, zDb);.
1b8e0 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
1b8f0 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
1b900 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b  Parse, pTab, 0);
1b910 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1b920 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72  ee(db, z);.    r
1b930 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e  eturn;.  }.  pIn
1b940 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
1b950 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44  dIndex(db, z, zD
1b960 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  b);.  sqlite3DbF
1b970 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66  ree(db, z);.  if
1b980 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
1b990 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1b9a0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
1b9b0 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
1b9c0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
1b9d0 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
1b9e0 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  x, -1);.    retu
1b9f0 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
1ba00 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1ba10 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65  , "unable to ide
1ba20 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74  ntify the object
1ba30 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
1ba40 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ");.}.#endif../*
1ba50 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 64 79 6e  .** Return a dyn
1ba60 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65 64  amicly allocated
1ba70 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
1ba80 72 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  re that can be u
1ba90 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f 4f  sed.** with OP_O
1baa0 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70  penRead or OP_Op
1bab0 65 6e 57 72 69 74 65 20 74 6f 20 61 63 63 65 73  enWrite to acces
1bac0 73 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  s database index
1bad0 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   pIdx..**.** If 
1bae0 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 70 6f  successful, a po
1baf0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
1bb00 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
1bb10 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  turned. In this 
1bb20 63 61 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  case.** the call
1bb30 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
1bb40 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73 71  e for calling sq
1bb50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1bb60 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65  ) on the returne
1bb70 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20 49  d .** pointer. I
1bb80 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1bb90 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  s (out of memory
1bba0 20 6f 72 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c   or missing coll
1bbb0 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71 75 65 6e  ation .** sequen
1bbc0 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  ce), NULL is ret
1bbd0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 74  urned and the st
1bbe0 61 74 65 20 6f 66 20 70 50 61 72 73 65 20 75 70  ate of pParse up
1bbf0 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63 74  dated to reflect
1bc00 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a  .** the error..*
1bc10 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74  /.KeyInfo *sqlit
1bc20 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 50  e3IndexKeyinfo(P
1bc30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
1bc40 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e  dex *pIdx){.  in
1bc50 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  t i;.  int nCol 
1bc60 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
1bc70 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 20 3d 20  .  int nBytes = 
1bc80 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
1bc90 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f  + (nCol-1)*sizeo
1bca0 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e 43  f(CollSeq*) + nC
1bcb0 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
1bcc0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1bcd0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20    KeyInfo *pKey 
1bce0 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c  = (KeyInfo *)sql
1bcf0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
1bd00 28 64 62 2c 20 6e 42 79 74 65 73 29 3b 0a 0a 20  (db, nBytes);.. 
1bd10 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
1bd20 20 70 4b 65 79 2d 3e 64 62 20 3d 20 70 50 61 72   pKey->db = pPar
1bd30 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 4b 65 79  se->db;.    pKey
1bd40 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
1bd50 75 38 20 2a 29 26 28 70 4b 65 79 2d 3e 61 43 6f  u8 *)&(pKey->aCo
1bd60 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20 61  ll[nCol]);.    a
1bd70 73 73 65 72 74 28 20 26 70 4b 65 79 2d 3e 61 53  ssert( &pKey->aS
1bd80 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d  ortOrder[nCol]==
1bd90 26 28 28 28 75 38 20 2a 29 70 4b 65 79 29 5b 6e  &(((u8 *)pKey)[n
1bda0 42 79 74 65 73 5d 29 20 29 3b 0a 20 20 20 20 66  Bytes]) );.    f
1bdb0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
1bdc0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  i++){.      char
1bdd0 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
1bde0 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
1bdf0 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 20 29   assert( zColl )
1be00 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43  ;.      pKey->aC
1be10 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  oll[i] = sqlite3
1be20 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
1be30 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29  arse, zColl, -1)
1be40 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53  ;.      pKey->aS
1be50 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49  ortOrder[i] = pI
1be60 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
1be70 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  ];.    }.    pKe
1be80 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c  y->nField = nCol
1be90 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
1bea0 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
1beb0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1bec0 62 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b  b, pKey);.    pK
1bed0 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ey = 0;.  }.  re
1bee0 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a           turn pKey;.}.