/ Hex Artifact Content
Login

Artifact fec792576c6e64200259ae5c0f7ee34a6c1abbae:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 34 34 35 20 32 30 30 37 2f 31 30 2f 30 34  1.445 2007/10/04
02f0: 20 31 38 3a 31 31 3a 31 36 20 64 61 6e 69 65 6c   18:11:16 daniel
0300: 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23  k1977 Exp $.*/.#
0310: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0320: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0330: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0340: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0350: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  called when a ne
0360: 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  w SQL statement 
0370: 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  is beginning to.
0380: 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20 20 49  ** be parsed.  I
0390: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 50  nitialize the pP
03a0: 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20 61  arse structure a
03b0: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69  s needed..*/.voi
03c0: 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61  d sqlite3BeginPa
03d0: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
03e0: 65 2c 20 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c  e, int explainFl
03f0: 61 67 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 65  ag){.  pParse->e
0400: 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69 6e  xplain = explain
0410: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
0420: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
0430: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0440: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0450: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0460: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0470: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0480: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0490: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
04a0: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
04b0: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
04c0: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
04d0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
04e0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04f0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
0500: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
0510: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
0520: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
0530: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
0540: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0550: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0560: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0570: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0580: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0590: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
05a0: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
05b0: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
05c0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
05d0: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
05e0: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05f0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
0600: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
0610: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
0620: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
0630: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
0640: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0650: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0660: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0670: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0680: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0690: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
06a0: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
06b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
06c0: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
06d0: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
06e0: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06f0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
0700: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
0710: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
0720: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
0730: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
0740: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0750: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0760: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0770: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0780: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0790: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
07a0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
07b0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
07c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
07d0: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
07e0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07f0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
0800: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
0810: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
0820: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
0830: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
0840: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0850: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0860: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0870: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0880: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0890: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
08a0: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
08b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
08c0: 20 20 69 6e 74 20 6e 42 79 74 65 73 3b 0a 20 20    int nBytes;.  
08d0: 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b 0a 0a 20  TableLock *p;.. 
08e0: 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20   if( iDb<0 ){.  
08f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
0900: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
0910: 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20  se->nTableLock; 
0920: 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  i++){.    p = &p
0930: 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63  Parse->aTableLoc
0940: 6b 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d  k[i];.    if( p-
0950: 3e 69 44 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e  >iDb==iDb && p->
0960: 69 54 61 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20  iTab==iTab ){.  
0970: 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f      p->isWriteLo
0980: 63 6b 20 3d 20 28 70 2d 3e 69 73 57 72 69 74 65  ck = (p->isWrite
0990: 4c 6f 63 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c  Lock || isWriteL
09a0: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ock);.      retu
09b0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rn;.    }.  }.. 
09c0: 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66   nBytes = sizeof
09d0: 28 54 61 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70  (TableLock) * (p
09e0: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
09f0: 6b 2b 31 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  k+1);.  pParse->
0a00: 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 20 0a 20 20  aTableLock = .  
0a10: 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61      sqlite3DbRea
0a20: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73  llocOrFree(pPars
0a30: 65 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61  e->db, pParse->a
0a40: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
0a50: 73 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  s);.  if( pParse
0a60: 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 29 7b 0a  ->aTableLock ){.
0a70: 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d      p = &pParse-
0a80: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 70 50 61 72  >aTableLock[pPar
0a90: 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b 2b  se->nTableLock++
0aa0: 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d 20  ];.    p->iDb = 
0ab0: 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62  iDb;.    p->iTab
0ac0: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e   = iTab;.    p->
0ad0: 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69 73  isWriteLock = is
0ae0: 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20 70  WriteLock;.    p
0af0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
0b00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
0b10: 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  arse->nTableLock
0b20: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65   = 0;.    pParse
0b30: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
0b40: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
0b50: 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
0b60: 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74 72 75  TableLock instru
0b70: 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74  ction for each t
0b80: 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79 20 74  able locked by t
0b90: 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  he.** statement 
0ba0: 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 63  (configured by c
0bb0: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 54  alls to sqlite3T
0bc0: 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a 2f 0a  ableLock())..*/.
0bd0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
0be0: 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72 73 65  TableLocks(Parse
0bf0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
0c00: 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56 64 62   i;.  Vdbe *pVdb
0c10: 65 3b 20 0a 0a 20 20 69 66 28 20 30 3d 3d 28 70  e; ..  if( 0==(p
0c20: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Vdbe = sqlite3Ge
0c30: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 20 29  tVdbe(pParse)) )
0c40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
0c50: 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
0c60: 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f  pParse->nTableLo
0c70: 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61  ck; i++){.    Ta
0c80: 62 6c 65 4c 6f 63 6b 20 2a 70 20 3d 20 26 70 50  bleLock *p = &pP
0c90: 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b  arse->aTableLock
0ca0: 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 70 31 20  [i];.    int p1 
0cb0: 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 20 20 69 66  = p->iDb;.    if
0cc0: 28 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b  ( p->isWriteLock
0cd0: 20 29 7b 0a 20 20 20 20 20 20 70 31 20 3d 20 2d   ){.      p1 = -
0ce0: 31 2a 28 70 31 2b 31 29 3b 0a 20 20 20 20 7d 0a  1*(p1+1);.    }.
0cf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
0d00: 70 33 28 70 56 64 62 65 2c 20 4f 50 5f 54 61 62  p3(pVdbe, OP_Tab
0d10: 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70 2d 3e 69  leLock, p1, p->i
0d20: 54 61 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50  Tab, p->zName, P
0d30: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d  3_STATIC);.  }.}
0d40: 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
0d50: 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28   codeTableLocks(
0d60: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
0d70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
0d80: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20   called after a 
0d90: 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65  single SQL state
0da0: 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a  ment has been.**
0db0: 20 70 61 72 73 65 64 20 61 6e 64 20 61 20 56 44   parsed and a VD
0dc0: 42 45 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78  BE program to ex
0dd0: 65 63 75 74 65 20 74 68 61 74 20 73 74 61 74 65  ecute that state
0de0: 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a  ment has been.**
0df0: 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 69 73   prepared.  This
0e00: 20 72 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68   routine puts th
0e10: 65 20 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63  e finishing touc
0e20: 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44  hes on the.** VD
0e30: 42 45 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72  BE program and r
0e40: 65 73 65 74 73 20 74 68 65 20 70 50 61 72 73 65  esets the pParse
0e50: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74   structure for t
0e60: 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65  he next.** parse
0e70: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
0e80: 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  t if an error oc
0e90: 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74  curred, it might
0ea0: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
0eb0: 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64  t.** no VDBE cod
0ec0: 65 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e  e was generated.
0ed0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0ee0: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72  FinishCoding(Par
0ef0: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0f00: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
0f10: 62 65 20 2a 76 3b 0a 0a 20 20 64 62 20 3d 20 70  be *v;..  db = p
0f20: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0f30: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0f40: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
0f50: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
0f60: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0f70: 20 21 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20   !pParse->pVdbe 
0f80: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
0f90: 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e->rc==SQLITE_OK
0fa0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
0fb0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
0fc0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
0fd0: 52 4f 52 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ROR;.      retur
0fe0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
0ff0: 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65  /* Begin by gene
1000: 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d  rating some term
1010: 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20  ination code at 
1020: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
1030: 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d   ** vdbe program
1040: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
1050: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1060: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
1070: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1080: 64 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  dOp(v, OP_Halt, 
1090: 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  0, 0);..    /* T
10a0: 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63  he cookie mask c
10b0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20  ontains one bit 
10c0: 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73  for each databas
10d0: 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20  e file open..   
10e0: 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f   ** (Bit 0 is fo
10f0: 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73  r main, bit 1 is
1100: 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73   for temp, and s
1110: 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20  o forth.)  Bits 
1120: 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66  are.    ** set f
1130: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
1140: 20 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20   that is used.  
1150: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1160: 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20   start a.    ** 
1170: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65  transaction on e
1180: 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73  ach used databas
1190: 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20  e and to verify 
11a0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
11b0: 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68  e.    ** on each
11c0: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a   used database..
11d0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
11e0: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
11f0: 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 33 32  o>0 ){.      u32
1200: 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74   mask;.      int
1210: 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71 6c 69   iDb;.      sqli
1220: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1230: 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  v, pParse->cooki
1240: 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20 20 20  eGoto-1);.      
1250: 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d  for(iDb=0, mask=
1260: 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  1; iDb<db->nDb; 
1270: 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29  mask<<=1, iDb++)
1280: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
1290: 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f  ask & pParse->co
12a0: 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63  okieMask)==0 ) c
12b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
12c0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
12d0: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
12e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72  beAddOp(v, OP_Tr
1300: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62 2c 20  ansaction, iDb, 
1310: 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e  (mask & pParse->
1320: 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29 3b 0a  writeMask)!=0);.
1330: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1340: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56  dbeAddOp(v, OP_V
1350: 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69 44 62  erifyCookie, iDb
1360: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
1370: 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20 20 20  Value[iDb]);.   
1380: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1390: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
13a0: 54 41 42 4c 45 0a 20 20 20 20 20 20 69 66 28 20  TABLE.      if( 
13b0: 70 50 61 72 73 65 2d 3e 70 56 69 72 74 75 61 6c  pParse->pVirtual
13c0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  Lock ){.        
13d0: 63 68 61 72 20 2a 76 74 61 62 20 3d 20 28 63 68  char *vtab = (ch
13e0: 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 70 56 69  ar *)pParse->pVi
13f0: 72 74 75 61 6c 4c 6f 63 6b 2d 3e 70 56 74 61 62  rtualLock->pVtab
1400: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1410: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 56  3VdbeOp3(v, OP_V
1420: 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 76 74 61  Begin, 0, 0, vta
1430: 62 2c 20 50 33 5f 56 54 41 42 29 3b 0a 20 20 20  b, P3_VTAB);.   
1440: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1450: 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20 74     /* Once all t
1460: 68 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65 20  he cookies have 
1470: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 61 6e  been verified an
1480: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  d transactions o
1490: 70 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a 2a  pened, .      **
14a0: 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75   obtain the requ
14b0: 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b 73  ired table-locks
14c0: 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
14d0: 70 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20 20  p unless the .  
14e0: 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61      ** shared-ca
14f0: 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20 65  che feature is e
1500: 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  nabled..      */
1510: 0a 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c 65  .      codeTable
1520: 4c 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a 20  Locks(pParse);. 
1530: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1540: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
1550: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  , 0, pParse->coo
1560: 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a  kieGoto);.    }.
1570: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1580: 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 2f  OMIT_TRACE.    /
1590: 2a 20 41 64 64 20 61 20 4e 6f 2d 6f 70 20 74 68  * Add a No-op th
15a0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
15b0: 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
15c0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 53 51   the compiled SQ
15d0: 4c 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  L.    ** stateme
15e0: 6e 74 20 61 73 20 69 74 73 20 50 33 20 61 72 67  nt as its P3 arg
15f0: 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 64 6f 65  ument.  This doe
1600: 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  s not change the
1610: 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20   functionality. 
1620: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f     ** of the pro
1630: 67 72 61 6d 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  gram. .    **.  
1640: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65    ** This is use
1650: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73  d to implement s
1660: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29 2e 0a  qlite3_trace()..
1670: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
1680: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
1690: 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 70 50 61 72  Noop, 0, 0, pPar
16a0: 73 65 2d 3e 7a 53 71 6c 2c 20 70 50 61 72 73 65  se->zSql, pParse
16b0: 2d 3e 7a 54 61 69 6c 2d 70 50 61 72 73 65 2d 3e  ->zTail-pParse->
16c0: 7a 53 71 6c 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  zSql);.#endif /*
16d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
16e0: 43 45 20 2a 2f 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  CE */.  }...  /*
16f0: 20 47 65 74 20 74 68 65 20 56 44 42 45 20 70 72   Get the VDBE pr
1700: 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20  ogram ready for 
1710: 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20  execution.  */. 
1720: 20 69 66 28 20 76 20 26 26 20 70 50 61 72 73 65   if( v && pParse
1730: 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21 64 62  ->nErr==0 && !db
1740: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1750: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1760: 44 45 42 55 47 0a 20 20 20 20 46 49 4c 45 20 2a  DEBUG.    FILE *
1770: 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61  trace = (db->fla
1780: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
1790: 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f  Trace)!=0 ? stdo
17a0: 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69  ut : 0;.    sqli
17b0: 74 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20  te3VdbeTrace(v, 
17c0: 74 72 61 63 65 29 3b 0a 23 65 6e 64 69 66 0a 20  trace);.#endif. 
17d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61     sqlite3VdbeMa
17e0: 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73  keReady(v, pPars
17f0: 65 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73 65 2d  e->nVar, pParse-
1800: 3e 6e 4d 65 6d 2b 33 2c 0a 20 20 20 20 20 20 20  >nMem+3,.       
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 33    pParse->nTab+3
1830: 2c 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  , pParse->explai
1840: 6e 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  n);.    pParse->
1850: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1860: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f  ;.    pParse->co
1870: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20  lNamesSet = 0;. 
1880: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 73   }else if( pPars
1890: 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e->rc==SQLITE_OK
18a0: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
18b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
18c0: 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  R;.  }.  pParse-
18d0: 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61  >nTab = 0;.  pPa
18e0: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20  rse->nMem = 0;. 
18f0: 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20   pParse->nSet = 
1900: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61  0;.  pParse->nVa
1910: 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  r = 0;.  pParse-
1920: 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b  >cookieMask = 0;
1930: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  .  pParse->cooki
1940: 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  eGoto = 0;.}../*
1950: 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73  .** Run the pars
1960: 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  er and code gene
1970: 72 61 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c  rator recursivel
1980: 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  y in order to ge
1990: 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66  nerate.** code f
19a0: 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  or the SQL state
19b0: 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20  ment given onto 
19c0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
19d0: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a  Parse context.**
19e0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
19f0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
1a00: 57 68 65 6e 20 74 68 65 20 70 61 72 73 65 72 20  When the parser 
1a10: 69 73 20 72 75 6e 20 72 65 63 75 72 73 69 76 65  is run recursive
1a20: 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20  ly.** this way, 
1a30: 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c  the final OP_Hal
1a40: 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65  t is not appende
1a50: 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74  d and other init
1a60: 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e  ialization.** an
1a70: 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73  d finalization s
1a80: 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64  teps are omitted
1a90: 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 61   because those a
1aa0: 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74  re handling by t
1ab0: 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20  he.** outermost 
1ac0: 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  parser..**.** No
1ad0: 74 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  t everything is 
1ae0: 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20  nestable.  This 
1af0: 66 61 63 69 6c 69 74 79 20 69 73 20 64 65 73 69  facility is desi
1b00: 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a  gned to permit.*
1b10: 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  * INSERT, UPDATE
1b20: 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65  , and DELETE ope
1b30: 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20  rations against 
1b40: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20  SQLITE_MASTER.  
1b50: 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79  Use.** care if y
1b60: 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74 72 79  ou decide to try
1b70: 20 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75   to use this rou
1b80: 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74  tine for some ot
1b90: 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f  her purposes..*/
1ba0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73  .void sqlite3Nes
1bb0: 74 65 64 50 61 72 73 65 28 50 61 72 73 65 20 2a  tedParse(Parse *
1bc0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
1bd0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
1be0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
1bf0: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 23  .  char *zSql;.#
1c00: 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20   define SAVE_SZ 
1c10: 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20   (sizeof(Parse) 
1c20: 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65  - offsetof(Parse
1c30: 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72 20 73  ,nVar)).  char s
1c40: 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b  aveBuf[SAVE_SZ];
1c50: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
1c60: 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
1c70: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1c80: 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f  >nested<10 );  /
1c90: 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64  * Nesting should
1ca0: 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69   only be of limi
1cb0: 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76  ted depth */.  v
1cc0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
1cd0: 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  mat);.  zSql = s
1ce0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
1cf0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 46 6f 72 6d  Parse->db, zForm
1d00: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
1d10: 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71  d(ap);.  if( zSq
1d20: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72  l==0 ){.    pPar
1d30: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1d40: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65  iled = 1;.    re
1d50: 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c  turn;   /* A mal
1d60: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1d70: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50  iled */.  }.  pP
1d80: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a  arse->nested++;.
1d90: 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66    memcpy(saveBuf
1da0: 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  , &pParse->nVar,
1db0: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d   SAVE_SZ);.  mem
1dc0: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  set(&pParse->nVa
1dd0: 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  r, 0, SAVE_SZ);.
1de0: 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73    sqlite3RunPars
1df0: 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c  er(pParse, zSql,
1e00: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
1e10: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d  ree(zSql);.  mem
1e20: 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  cpy(&pParse->nVa
1e30: 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41 56 45  r, saveBuf, SAVE
1e40: 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  _SZ);.  pParse->
1e50: 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a  nested--;.}../*.
1e60: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
1e70: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
1e80: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
1e90: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
1ea0: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
1eb0: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
1ec0: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
1ed0: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
1ee0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
1ef0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
1f00: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
1f10: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
1f20: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
1f30: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
1f40: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
1f50: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
1f60: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  or the table and
1f70: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61   the.** first ma
1f80: 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20  tching table is 
1f90: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
1fa0: 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c  hecking for dupl
1fb0: 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e  icate table.** n
1fc0: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
1fd0: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
1fe0: 20 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20   is TEMP first, 
1ff0: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
2000: 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79  any.** auxiliary
2010: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
2020: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
2030: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  H command..**.**
2040: 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
2050: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a  3LocateTable()..
2060: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
2070: 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74  3FindTable(sqlit
2080: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
2090: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
20a0: 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65   char *zDatabase
20b0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  ){.  Table *p = 
20c0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  0;.  int i;.  as
20d0: 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29  sert( zName!=0 )
20e0: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
20f0: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
2100: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
2110: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
2120: 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68  : i;   /* Search
2130: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
2140: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 61  N */.    if( zDa
2150: 74 61 62 61 73 65 21 3d 30 20 26 26 20 73 71 6c  tabase!=0 && sql
2160: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74  ite3StrICmp(zDat
2170: 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a  abase, db->aDb[j
2180: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2190: 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  nue;.    p = sql
21a0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
21b0: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
21c0: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65  ->tblHash, zName
21d0: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b  , strlen(zName)+
21e0: 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20  1);.    if( p ) 
21f0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
2200: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
2210: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
2220: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
2230: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
2240: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
2250: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
2260: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
2270: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
2280: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
2290: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
22a0: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
22b0: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
22c0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
22d0: 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65   found.  Also le
22e0: 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20  ave an.** error 
22f0: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
2300: 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
2310: 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
2320: 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
2330: 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65  utine and sqlite
2340: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20  3FindTable() is 
2350: 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75  that this.** rou
2360: 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65  tine leaves an e
2370: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
2380: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20  pParse->zErrMsg 
2390: 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33  where.** sqlite3
23a0: 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73  FindTable() does
23b0: 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a   not..*/.Table *
23c0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
23d0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
23e0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
23f0: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
2400: 2a 7a 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c  *zDbase){.  Tabl
2410: 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  e *p;..  /* Read
2420: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2430: 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
2440: 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
2450: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2460: 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
2470: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
2480: 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
2490: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
24a0: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
24b0: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72  pParse) ){.    r
24c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
24d0: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  p = sqlite3FindT
24e0: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
24f0: 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b   zName, zDbase);
2500: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
2510: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
2520: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
2530: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2540: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
2550: 73 2e 25 73 22 2c 20 7a 44 62 61 73 65 2c 20 7a  s.%s", zDbase, z
2560: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
2570: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2580: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2590: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
25a0: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
25b0: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63   }.    pParse->c
25c0: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
25d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
25e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
25f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
2600: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2610: 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72  cribes .** a par
2620: 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69  ticular index gi
2630: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2640: 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e  that index.** an
2650: 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
2660: 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
2670: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64  contains the ind
2680: 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55  ex..** Return NU
2690: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
26a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
26b0: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
26c0: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
26d0: 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ched for the.** 
26e0: 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69  table and the fi
26f0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64  rst matching ind
2700: 65 78 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ex is returned. 
2710: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a   (No checking.**
2720: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69   for duplicate i
2730: 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f  ndex names is do
2740: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
2750: 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d   order is.** TEM
2760: 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41  P first, then MA
2770: 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78  IN, then any aux
2780: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2790: 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20   added.** using 
27a0: 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61  the ATTACH comma
27b0: 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  nd..*/.Index *sq
27c0: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73  lite3FindIndex(s
27d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
27e0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
27f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
2800: 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b  .  Index *p = 0;
2810: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
2820: 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69  i=OMIT_TEMPDB; i
2830: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
2840: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
2850: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a  ) ? i^1 : i;  /*
2860: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
2870: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
2880: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
2890: 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63  = db->aDb[j].pSc
28a0: 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 7a 44  hema;.    if( zD
28b0: 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  b && sqlite3StrI
28c0: 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62  Cmp(zDb, db->aDb
28d0: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
28e0: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
28f0: 74 28 20 70 53 63 68 65 6d 61 20 7c 7c 20 28 6a  t( pSchema || (j
2900: 3d 3d 31 20 26 26 20 21 64 62 2d 3e 61 44 62 5b  ==1 && !db->aDb[
2910: 31 5d 2e 70 42 74 29 20 29 3b 0a 20 20 20 20 69  1].pBt) );.    i
2920: 66 28 20 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  f( pSchema ){.  
2930: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
2940: 61 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61  ashFind(&pSchema
2950: 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65  ->idxHash, zName
2960: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b  , strlen(zName)+
2970: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
2980: 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ( p ) break;.  }
2990: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
29a0: 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68  /*.** Reclaim th
29b0: 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  e memory used by
29c0: 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61   an index.*/.sta
29d0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64  tic void freeInd
29e0: 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ex(Index *p){.  
29f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
2a00: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69  zColAff);.  sqli
2a10: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a  te3_free(p);.}..
2a20: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
2a30: 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f   given index fro
2a40: 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  m the index hash
2a50: 20 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65   table, and free
2a60: 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73  .** its memory s
2a70: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a  tructures..**.**
2a80: 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 72 65   The index is re
2a90: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64  moved from the d
2aa0: 61 74 61 62 61 73 65 20 68 61 73 68 20 74 61 62  atabase hash tab
2ab0: 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73  les but.** it is
2ac0: 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72   not unlinked fr
2ad0: 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68 61  om the Table tha
2ae0: 74 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a  t it indexes..**
2af0: 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20   Unlinking from 
2b00: 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62  the Table must b
2b10: 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61  e done by the ca
2b20: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
2b30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2b40: 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78  qliteDeleteIndex
2b50: 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e  (Index *p){.  In
2b60: 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e  dex *pOld;.  con
2b70: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
2b80: 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f   p->zName;..  pO
2b90: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
2ba0: 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65  Insert(&p->pSche
2bb0: 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61  ma->idxHash, zNa
2bc0: 6d 65 2c 20 73 74 72 6c 65 6e 28 20 7a 4e 61 6d  me, strlen( zNam
2bd0: 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65  e)+1, 0);.  asse
2be0: 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70  rt( pOld==0 || p
2bf0: 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65 65  Old==p );.  free
2c00: 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  Index(p);.}../*.
2c10: 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78  ** For the index
2c20: 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65   called zIdxName
2c30: 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20   which is found 
2c40: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2c50: 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74  iDb,.** unlike t
2c60: 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69  hat index from i
2c70: 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65  ts Table then re
2c80: 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66  move the index f
2c90: 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rom.** the index
2ca0: 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
2cb0: 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  free all memory 
2cc0: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
2cd0: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
2ce0: 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64  e index..*/.void
2cf0: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
2d00: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c  dDeleteIndex(sql
2d10: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
2d20: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2d30: 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65  IdxName){.  Inde
2d40: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  x *pIndex;.  int
2d50: 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70 48   len;.  Hash *pH
2d60: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
2d70: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
2d80: 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73  Hash;..  len = s
2d90: 74 72 6c 65 6e 28 7a 49 64 78 4e 61 6d 65 29 3b  trlen(zIdxName);
2da0: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
2db0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
2dc0: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c  ash, zIdxName, l
2dd0: 65 6e 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  en+1, 0);.  if( 
2de0: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66  pIndex ){.    if
2df0: 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ( pIndex->pTable
2e00: 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78  ->pIndex==pIndex
2e10: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
2e20: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
2e30: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
2e40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e50: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
2e60: 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d     for(p=pIndex-
2e70: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
2e80: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d   p && p->pNext!=
2e90: 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65  pIndex; p=p->pNe
2ea0: 78 74 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20  xt){}.      if( 
2eb0: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
2ec0: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Index ){.       
2ed0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64   p->pNext = pInd
2ee0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ex->pNext;.     
2ef0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
2f00: 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
2f10: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
2f20: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
2f30: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
2f40: 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65  * Erase all sche
2f50: 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ma information f
2f60: 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  rom the in-memor
2f70: 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66  y hash tables of
2f80: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74  .** a single dat
2f90: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
2fa0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
2fb0: 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79  o reclaim memory
2fc0: 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64  .** before the d
2fd0: 61 74 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20  atabase closes. 
2fe0: 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c   It is also call
2ff0: 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ed during a roll
3000: 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65  back.** if there
3010: 20 77 65 72 65 20 73 63 68 65 6d 61 20 63 68 61   were schema cha
3020: 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20  nges during the 
3030: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69  transaction or i
3040: 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f  f a.** schema-co
3050: 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63  okie mismatch oc
3060: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  curs..**.** If i
3070: 44 62 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74  Db<=0 then reset
3080: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
3090: 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20  hema tables for 
30a0: 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  all database.** 
30b0: 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d  files.  If iDb>=
30c0: 32 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  2 then reset the
30d0: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
30e0: 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a   for only the.**
30f0: 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64   single file ind
3100: 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  icated..*/.void 
3110: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
3120: 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74  rnalSchema(sqlit
3130: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
3140: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20  {.  int i, j;.. 
3150: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
3160: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
3170: 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69  ;.  for(i=iDb; i
3180: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
3190: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
31a0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
31b0: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
31c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
31d0: 53 63 68 65 6d 61 46 72 65 65 28 70 44 62 2d 3e  SchemaFree(pDb->
31e0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
31f0: 20 20 20 20 69 66 28 20 69 44 62 3e 30 20 29 20      if( iDb>0 ) 
3200: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
3210: 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a  sert( iDb==0 );.
3220: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
3230: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
3240: 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  nges;..  /* If o
3250: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
3260: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
3270: 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62  base files has b
3280: 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a  een closed,.  **
3290: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
32a0: 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c  m from the auxil
32b0: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69  iary database li
32c0: 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65  st.  We take the
32d0: 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  .  ** opportunit
32e0: 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72  y to do this her
32f0: 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20  e since we have 
3300: 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c  just deleted all
3310: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68   of the.  ** sch
3320: 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20  ema hash tables 
3330: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f  and therefore do
3340: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b   not have to mak
3350: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20  e any changes.  
3360: 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f  ** to any of tho
3370: 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
3380: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
3390: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
33a0: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
33b0: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
33c0: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d    if( pDb->pBt==
33d0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
33e0: 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d  Db->pAux && pDb-
33f0: 3e 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d  >xFreeAux ) pDb-
3400: 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70  >xFreeAux(pDb->p
3410: 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  Aux);.      pDb-
3420: 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d  >pAux = 0;.    }
3430: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32  .  }.  for(i=j=2
3440: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
3450: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
3460: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3470: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3480: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
3490: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
34a0: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
34b0: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
34c0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
34d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
34e0: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
34f0: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
3500: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
3510: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
3520: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
3530: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
3540: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
3550: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
3560: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
3570: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
3580: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
3590: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
35a0: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
35b0: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
35c0: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
35d0: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61  lite3_free(db->a
35e0: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
35f0: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
3600: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3610: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3620: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d  alled when a com
3630: 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  mit occurs..*/.v
3640: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
3650: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
3660: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
3670: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
3680: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3690: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ges;.}../*.** Cl
36a0: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
36b0: 61 6d 65 73 20 66 72 6f 6d 20 61 20 74 61 62 6c  ames from a tabl
36c0: 65 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74  e or view..*/.st
36d0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
36e0: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
36f0: 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b  (Table *pTable){
3700: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75  .  int i;.  Colu
3710: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65  mn *pCol;.  asse
3720: 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b  rt( pTable!=0 );
3730: 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70  .  if( (pCol = p
3740: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20  Table->aCol)!=0 
3750: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
3760: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
3770: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
3780: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3790: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
37a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
37b0: 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66  Delete(pCol->pDf
37c0: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
37d0: 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  e3_free(pCol->zT
37e0: 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ype);.      sqli
37f0: 74 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a  te3_free(pCol->z
3800: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Coll);.    }.   
3810: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
3820: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
3830: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
3840: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 0;.  pTable->n
3850: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
3860: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
3870: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
3880: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
3890: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
38a0: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
38b0: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
38c0: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
38d0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
38e0: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
38f0: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
3900: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
3910: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
3920: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
3930: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
3940: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
3950: 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f  Nor does it remo
3960: 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65  ve.** foreign ke
3970: 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  ys from the sqli
3980: 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61  te.aFKey hash ta
3990: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
39a0: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
39b0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
39c0: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
39d0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
39e0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
39f0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  ** the table..*/
3a00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
3a10: 65 74 65 54 61 62 6c 65 28 54 61 62 6c 65 20 2a  eteTable(Table *
3a20: 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78  pTable){.  Index
3a30: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74   *pIndex, *pNext
3a40: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c  ;.  FKey *pFKey,
3a50: 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20   *pNextFKey;..  
3a60: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
3a70: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f  return;..  /* Do
3a80: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
3a90: 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20  table until the 
3aa0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
3ab0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f  reaches zero. */
3ac0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d  .  pTable->nRef-
3ad0: 2d 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  -;.  if( pTable-
3ae0: 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72  >nRef>0 ){.    r
3af0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
3b00: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65  ert( pTable->nRe
3b10: 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65  f==0 );..  /* De
3b20: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
3b30: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3b40: 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f   this table.  */
3b50: 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20  .  for(pIndex = 
3b60: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
3b70: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
3b80: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
3b90: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
3ba0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
3bb0: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  ndex->pSchema==p
3bc0: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29  Table->pSchema )
3bd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  ;.    sqliteDele
3be0: 74 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  teIndex(pIndex);
3bf0: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
3c00: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
3c10: 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74  N_KEY.  /* Delet
3c20: 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65  e all foreign ke
3c30: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
3c40: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20  th this table.  
3c50: 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68  The keys.  ** sh
3c60: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
3c70: 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20  y been unlinked 
3c80: 66 72 6f 6d 20 74 68 65 20 70 53 63 68 65 6d 61  from the pSchema
3c90: 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62  ->aFKey hash tab
3ca0: 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  le .  */.  for(p
3cb0: 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b  FKey=pTable->pFK
3cc0: 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79  ey; pFKey; pFKey
3cd0: 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20  =pNextFKey){.   
3ce0: 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b   pNextFKey = pFK
3cf0: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20  ey->pNextFrom;. 
3d00: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
3d10: 65 33 48 61 73 68 46 69 6e 64 28 26 70 54 61 62  e3HashFind(&pTab
3d20: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b  le->pSchema->aFK
3d30: 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3d50: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65  FKey->zTo, strle
3d60: 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29  n(pFKey->zTo)+1)
3d70: 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73  !=pFKey );.    s
3d80: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 4b 65  qlite3_free(pFKe
3d90: 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  y);.  }.#endif..
3da0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
3db0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
3dc0: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
3dd0: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
3de0: 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20  Names(pTable);. 
3df0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
3e00: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
3e10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61  sqlite3_free(pTa
3e20: 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  ble->zColAff);. 
3e30: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
3e40: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65  lete(pTable->pSe
3e50: 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  lect);.#ifndef S
3e60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
3e70: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
3e80: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 43 68  lete(pTable->pCh
3e90: 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  eck);.#endif.  s
3ea0: 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28  qlite3VtabClear(
3eb0: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
3ec0: 65 33 5f 66 72 65 65 28 70 54 61 62 6c 65 29 3b  e3_free(pTable);
3ed0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
3ee0: 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65   the given table
3ef0: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
3f00: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65  ables and the de
3f10: 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  lete the.** tabl
3f20: 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  e structure with
3f30: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
3f40: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
3f50: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
3f60: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
3f70: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
3f80: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
3f90: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  st char *zTabNam
3fa0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
3fb0: 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46    FKey *pF1, *pF
3fc0: 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  2;.  Db *pDb;.. 
3fd0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
3fe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
3ff0: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
4000: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  b );.  assert( z
4010: 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e  TabName && zTabN
4020: 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20  ame[0] );.  pDb 
4030: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
4040: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61  .  p = sqlite3Ha
4050: 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70  shInsert(&pDb->p
4060: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
4070: 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65   zTabName, strle
4080: 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 30 29  n(zTabName)+1,0)
4090: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66  ;.  if( p ){.#if
40a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
40b0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
40c0: 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65   for(pF1=p->pFKe
40d0: 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d  y; pF1; pF1=pF1-
40e0: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
40f0: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72     int nTo = str
4100: 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20  len(pF1->zTo) + 
4110: 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73  1;.      pF2 = s
4120: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
4130: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46  pDb->pSchema->aF
4140: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
4150: 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  To);.      if( p
4160: 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20  F2==pF1 ){.     
4170: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
4180: 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65  sert(&pDb->pSche
4190: 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e  ma->aFKey, pF1->
41a0: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70  zTo, nTo, pF1->p
41b0: 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d  NextTo);.      }
41c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68  else{.        wh
41d0: 69 6c 65 28 20 70 46 32 20 26 26 20 70 46 32 2d  ile( pF2 && pF2-
41e0: 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b  >pNextTo!=pF1 ){
41f0: 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54   pF2=pF2->pNextT
4200: 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  o; }.        if(
4210: 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20   pF2 ){.        
4220: 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d    pF2->pNextTo =
4230: 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20   pF1->pNextTo;. 
4240: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4250: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
4260: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
4270: 61 62 6c 65 28 70 29 3b 0a 20 20 7d 0a 20 20 64  able(p);.  }.  d
4280: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
4290: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
42a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
42b0: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
42c0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
42d0: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
42e0: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
42f0: 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20 71 75  oken with any qu
4300: 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65 64  otations removed
4310: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
4320: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
4330: 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69  ring.** is obtai
4340: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
4350: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
4360: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
4370: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
4380: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65  tion..**.** Toke
4390: 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73  ns are often jus
43a0: 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20  t pointers into 
43b0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
43c0: 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20   text and so.** 
43d0: 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72  are not \000 ter
43e0: 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20  minated and are 
43f0: 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20  not persistent. 
4400: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   The returned st
4410: 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20  ring.** is \000 
4420: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69  terminated and i
4430: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f  s persistent..*/
4440: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61  .char *sqlite3Na
4450: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69  meFromToken(sqli
4460: 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a  te3 *db, Token *
4470: 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  pName){.  char *
4480: 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61  zName;.  if( pNa
4490: 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
44a0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
44b0: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e  up(db, (char*)pN
44c0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
44d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
44e0: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
44f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
4500: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
4510: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zName;.}../*.
4520: 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69  ** Open the sqli
4530: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
4540: 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61  stored in databa
4550: 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f  se number iDb fo
4560: 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68  r.** writing. Th
4570: 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65  e table is opene
4580: 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30  d using cursor 0
4590: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
45a0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
45b0: 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69  (Parse *p, int i
45c0: 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
45d0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
45e0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62  p);.  sqlite3Tab
45f0: 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d  leLock(p, iDb, M
4600: 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53  ASTER_ROOT, 1, S
4610: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
4620: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
4630: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
4640: 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ger, iDb, 0);.  
4650: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4660: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
4670: 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  , 0, MASTER_ROOT
4680: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
4690: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e  AddOp(v, OP_SetN
46a0: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35 29  umColumns, 0, 5)
46b0: 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74  ; /* sqlite_mast
46c0: 65 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73  er has 5 columns
46d0: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   */.}../*.** The
46e0: 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f   token *pName co
46f0: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20  ntains the name 
4700: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65  of a database (e
4710: 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a  ither "main" or.
4720: 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65  ** "temp" or the
4730: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61   name of an atta
4740: 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72  ched db). This r
4750: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
4760: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74  he.** index of t
4770: 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  he named databas
4780: 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20  e in db->aDb[], 
4790: 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  or -1 if the nam
47a0: 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e  ed db .** does n
47b0: 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74  ot exist..*/.int
47c0: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73   sqlite3FindDb(s
47d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
47e0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  n *pName){.  int
47f0: 20 69 20 3d 20 2d 31 3b 20 20 20 20 2f 2a 20 44   i = -1;    /* D
4800: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
4810: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
4820: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4830: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
4840: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 44 62 20 2a  e name */.  Db *
4850: 70 44 62 3b 20 20 20 20 20 20 20 2f 2a 20 41 20  pDb;       /* A 
4860: 64 61 74 61 62 61 73 65 20 77 68 6f 73 65 20 6e  database whose n
4870: 61 6d 65 20 73 70 61 63 65 20 69 73 20 62 65 69  ame space is bei
4880: 6e 67 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  ng searched */. 
4890: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
48a0: 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73  /* Name we are s
48b0: 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a  earching for */.
48c0: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
48d0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
48e0: 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
48f0: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 6e  ( zName ){.    n
4900: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
4910: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d  ;.    for(i=(db-
4920: 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62  >nDb-1), pDb=&db
4930: 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20  ->aDb[i]; i>=0; 
4940: 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20  i--, pDb--){.   
4950: 20 20 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45     if( (!OMIT_TE
4960: 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26  MPDB || i!=1 ) &
4970: 26 20 6e 3d 3d 73 74 72 6c 65 6e 28 70 44 62 2d  & n==strlen(pDb-
4980: 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20  >zName) && .    
4990: 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33        0==sqlite3
49a0: 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61  StrICmp(pDb->zNa
49b0: 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  me, zName) ){.  
49c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
49d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
49e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
49f0: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
4a00: 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61   i;.}../* The ta
4a10: 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74  ble or view or t
4a20: 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70  rigger name is p
4a30: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
4a40: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
4a50: 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70  .** pName1 and p
4a60: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
4a70: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
4a80: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
4a90: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
4aa0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
4ab0: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20  x.yyy (...);.** 
4ac0: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
4ad0: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
4ae0: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
4af0: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
4b00: 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  and if.** the ta
4b10: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
4b20: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
4b30: 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45   i.e.:.**.** CRE
4b40: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
4b50: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70  .);.**.** Then p
4b60: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
4b70: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
4b80: 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68   is ""..**.** Th
4b90: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
4ba0: 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f  the *ppUnqual po
4bb0: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
4bc0: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
4bd0: 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32  me1 or.** pName2
4be0: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
4bf0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
4c00: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
4c10: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64  ndex of the.** d
4c20: 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73  atabase "xxx" is
4c30: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
4c40: 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  t sqlite3TwoPart
4c50: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
4c60: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
4c70: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
4c80: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
4c90: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
4ca0: 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54  Name1,      /* T
4cb0: 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20  he "xxx" in the 
4cc0: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f  name "xxx.yyy" o
4cd0: 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b  r "xxx" */.  Tok
4ce0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
4cf0: 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e   /* The "yyy" in
4d00: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
4d10: 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  yy" */.  Token *
4d20: 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20  *pUnqual     /* 
4d30: 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c  Write the unqual
4d40: 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d  ified object nam
4d50: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
4d60: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
4d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
4d80: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
4d90: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  he object */.  s
4da0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
4db0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
4dc0: 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32  pName2 && pName2
4dd0: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  ->n>0 ){.    ass
4de0: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
4df0: 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71  usy );.    *pUnq
4e00: 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20  ual = pName2;.  
4e10: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
4e20: 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31  indDb(db, pName1
4e30: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
4e40: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4e50: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4e60: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62  , "unknown datab
4e70: 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29  ase %T", pName1)
4e80: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
4e90: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
4ea0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
4eb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
4ec0: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  rt( db->init.iDb
4ed0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ==0 || db->init.
4ee0: 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20  busy );.    iDb 
4ef0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
4f00: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
4f10: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
4f20: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
4f30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4f40: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
4f50: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
4f60: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
4f70: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
4f80: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
4f90: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
4fa0: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
4fb0: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
4fc0: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
4fd0: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
4fe0: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
4ff0: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
5000: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
5010: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
5020: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
5030: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
5040: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
5050: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
5060: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f  internal use..*/
5070: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
5080: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73  kObjectName(Pars
5090: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
50a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
50b0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
50c0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
50d0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
50e0: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
50f0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
5100: 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65  s & SQLITE_Write
5110: 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20  Schema)==0.     
5120: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
5130: 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65  e3StrNICmp(zName
5140: 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20  , "sqlite_", 7) 
5150: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
5160: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
5170: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65  object name rese
5180: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
5190: 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d  l use: %s", zNam
51a0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
51b0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
51c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
51d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  _OK;.}../*.** Be
51e0: 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  gin constructing
51f0: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70   a new table rep
5200: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d  resentation in m
5210: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a  emory.  This is.
5220: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  ** the first of 
5230: 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72  several action r
5240: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74  outines that get
5250: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f   called in respo
5260: 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41  nse.** to a CREA
5270: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
5280: 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c  nt.  In particul
5290: 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ar, this routine
52a0: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66   is called.** af
52b0: 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e  ter seeing token
52c0: 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22  s "CREATE" and "
52d0: 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74  TABLE" and the t
52e0: 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69  able name. The i
52f0: 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73  sTemp.** flag is
5300: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62   true if the tab
5310: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  le should be sto
5320: 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c  red in the auxil
5330: 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  iary database.**
5340: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
5350: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
5360: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
5370: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68  s is normally th
5380: 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74  e case.** when t
5390: 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45  he "TEMP" or "TE
53a0: 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64  MPORARY" keyword
53b0: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
53c0: 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64  en.** CREATE and
53d0: 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68   TABLE..**.** Th
53e0: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
53f0: 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  rd is initialize
5400: 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61  d and put in pPa
5410: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a  rse->pNewTable..
5420: 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68  ** As more of th
5430: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
5440: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
5450: 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61  ed, additional a
5460: 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65  ction.** routine
5470: 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  s will be called
5480: 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66   to add more inf
5490: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
54a0: 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74   record..** At t
54b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
54c0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
54d0: 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65  ment, the sqlite
54e0: 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74  3EndTable() rout
54f0: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
5500: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
5510: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66   construction of
5520: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   the new table r
5530: 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ecord..*/.void s
5540: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
5550: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5560: 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63  e,   /* Parser c
5570: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
5580: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20  n *pName1,   /* 
5590: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68  First part of th
55a0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
55b0: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
55c0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
55d0: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
55e0: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
55f0: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
5600: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
5610: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
5620: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
5630: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
5640: 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a   isView,      /*
5650: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
5660: 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74   a VIEW */.  int
5670: 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a   isVirtual,   /*
5680: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
5690: 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65   a VIRTUAL table
56a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
56b0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
56c0: 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c  hing if table al
56d0: 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
56e0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
56f0: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  le;.  char *zNam
5700: 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61  e = 0; /* The na
5710: 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  me of the new ta
5720: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
5730: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5740: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
5750: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
5760: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5770: 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68  ber to create th
5780: 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20  e table in */.  
5790: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20  Token *pName;   
57a0: 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
57b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
57c0: 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a  e to create */..
57d0: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f    /* The table o
57e0: 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63  r view name to c
57f0: 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64 20  reate is passed 
5800: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
5810: 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20  via tokens.  ** 
5820: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
5830: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
5840: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
5850: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
5860: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
5870: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
5880: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a  x.yyy (...);.  *
5890: 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  * .  ** Then pNa
58a0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
58b0: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
58c0: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
58d0: 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20  er hand if.  ** 
58e0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
58f0: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
5900: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a  ified, i.e.:.  *
5910: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
5920: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20  BLE yyy(...);.  
5930: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  **.  ** Then pNa
5940: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
5950: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
5960: 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  s ""..  **.  ** 
5970: 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73  The call below s
5980: 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f  ets the pName po
5990: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
59a0: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
59b0: 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d  me1 or.  ** pNam
59c0: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
59d0: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
59e0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
59f0: 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a  variable iDb is.
5a00: 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20    ** set to the 
5a10: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
5a20: 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20 74  abase that the t
5a30: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20  able or view is 
5a40: 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  to be.  ** creat
5a50: 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44  ed in..  */.  iD
5a60: 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
5a70: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
5a80: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
5a90: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  pName);.  if( iD
5aa0: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
5ab0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
5ac0: 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 69 44   && isTemp && iD
5ad0: 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  b>1 ){.    /* If
5ae0: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70   creating a temp
5af0: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65   table, the name
5b00: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
5b10: 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c  ified */.    sql
5b20: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5b30: 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20  rse, "temporary 
5b40: 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20  table name must 
5b50: 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29  be unqualified")
5b60: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
5b70: 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45  }.  if( !OMIT_TE
5b80: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
5b90: 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61   iDb = 1;..  pPa
5ba0: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20  rse->sNameToken 
5bb0: 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d  = *pName;.  zNam
5bc0: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
5bd0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
5be0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
5bf0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
5c00: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
5c10: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
5c20: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
5c30: 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ame) ){.    goto
5c40: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
5c50: 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  or;.  }.  if( db
5c60: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20  ->init.iDb==1 ) 
5c70: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e  isTemp = 1;.#ifn
5c80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5c90: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
5ca0: 61 73 73 65 72 74 28 20 28 69 73 54 65 6d 70 20  assert( (isTemp 
5cb0: 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a  & 1)==isTemp );.
5cc0: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
5cd0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20  ;.    char *zDb 
5ce0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
5cf0: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
5d00: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
5d10: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
5d20: 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
5d30: 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a  LE(isTemp), 0, z
5d40: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
5d50: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5d60: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
5d70: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
5d80: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
5d90: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b  PDB && isTemp ){
5da0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
5db0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
5dc0: 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
5dd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
5de0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
5df0: 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  TE_VIEW;.      }
5e00: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5e10: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
5e20: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a  DB && isTemp ){.
5e30: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
5e40: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
5e50: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
5e60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
5e70: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
5e80: 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  TE_TABLE;.      
5e90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
5ea0: 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71  !isVirtual && sq
5eb0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
5ec0: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61  Parse, code, zNa
5ed0: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
5ee0: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
5ef0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
5f00: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
5f10: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
5f20: 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  e new table name
5f30: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64   does not collid
5f40: 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69  e with an existi
5f50: 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  ng.  ** index or
5f60: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74   table name in t
5f70: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
5f80: 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f  .  Issue an erro
5f90: 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a  r message if.  *
5fa0: 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65  * it does. The e
5fb0: 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74  xception is if t
5fc0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  he statement bei
5fd0: 6e 67 20 70 61 72 73 65 64 20 77 61 73 20 70 61  ng parsed was pa
5fe0: 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20  ssed.  ** to an 
5ff0: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
6000: 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20  vtab() call. In 
6010: 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74  that case only t
6020: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a  he column names.
6030: 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77    ** and types w
6040: 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20  ill be used, so 
6050: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
6060: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d   to test for nam
6070: 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c  espace.  ** coll
6080: 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  isions..  */.  i
6090: 66 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56  f( !IN_DECLARE_V
60a0: 54 41 42 20 29 7b 0a 20 20 20 20 69 66 28 20 53  TAB ){.    if( S
60b0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
60c0: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
60d0: 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  se) ){.      got
60e0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
60f0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ror;.    }.    p
6100: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46  Table = sqlite3F
6110: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
6120: 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  me, db->aDb[iDb]
6130: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  .zName);.    if(
6140: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20   pTable ){.     
6150: 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20   if( !noErr ){. 
6160: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
6170: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6180: 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79  table %T already
6190: 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29   exists", pName)
61a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
61b0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
61c0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
61d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
61e0: 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
61f0: 2c 20 30 29 21 3d 30 20 26 26 20 28 69 44 62 3d  , 0)!=0 && (iDb=
6200: 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e  =0 || !db->init.
6210: 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73  busy) ){.      s
6220: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6230: 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73  Parse, "there is
6240: 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65   already an inde
6250: 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  x named %s", zNa
6260: 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
6270: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
6280: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
6290: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  pTable = sqlite3
62a0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
62b0: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
62c0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
62d0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   ){.    db->mall
62e0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
62f0: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
6300: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
6310: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
6320: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
6330: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
6340: 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  .  pTable->zName
6350: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62   = zName;.  pTab
6360: 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  le->iPKey = -1;.
6370: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
6380: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
6390: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62  .pSchema;.  pTab
63a0: 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  le->nRef = 1;.  
63b0: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  if( pParse->pNew
63c0: 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33 44  Table ) sqlite3D
63d0: 65 6c 65 74 65 54 61 62 6c 65 28 70 50 61 72 73  eleteTable(pPars
63e0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20  e->pNewTable);. 
63f0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6400: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
6410: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
6420: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
6430: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
6440: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
6450: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
6460: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
6470: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
6480: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
6490: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
64a0: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
64b0: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
64c0: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
64d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
64e0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
64f0: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  NT.  if( !pParse
6500: 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63  ->nested && strc
6510: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
6520: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
6530: 29 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70  ){.    pTable->p
6540: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20  Schema->pSeqTab 
6550: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  = pTable;.  }.#e
6560: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ndif..  /* Begin
6570: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
6580: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
6590: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
65a0: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
65b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
65c0: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
65d0: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
65e0: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
65f0: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
6600: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
6610: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6620: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
6630: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
6640: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
6650: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
6660: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
6670: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
6680: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
6690: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
66a0: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
66b0: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
66c0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
66d0: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
66e0: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
66f0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
6700: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
6710: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
6720: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
6730: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20  init.busy && (v 
6740: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
6750: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
6760: 20 20 20 20 69 6e 74 20 6c 62 6c 3b 0a 20 20 20      int lbl;.   
6770: 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b   int fileFormat;
6780: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
6790: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
67a0: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
67b0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
67c0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
67d0: 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56 69 72  LE.    if( isVir
67e0: 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  tual ){.      sq
67f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6800: 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c 20  , OP_VBegin, 0, 
6810: 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
6820: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
6830: 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20  file format and 
6840: 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20  encoding in the 
6850: 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f  database have no
6860: 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20  t been set, .   
6870: 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77   ** set them now
6880: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
6890: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
68a0: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
68b0: 69 44 62 2c 20 31 29 3b 20 20 20 2f 2a 20 66 69  iDb, 1);   /* fi
68c0: 6c 65 5f 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20  le_format */.   
68d0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
68e0: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
68f0: 20 20 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33     lbl = sqlite3
6900: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
6910: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6920: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c  eAddOp(v, OP_If,
6930: 20 30 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 66 69   0, lbl);.    fi
6940: 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e  leFormat = (db->
6950: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c  flags & SQLITE_L
6960: 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30  egacyFileFmt)!=0
6970: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
6980: 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f       1 : SQLITE_
6990: 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b  MAX_FILE_FORMAT;
69a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
69b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
69c0: 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c  ger, fileFormat,
69d0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
69e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
69f0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
6a00: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
6a10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6a20: 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29 2c  nteger, ENC(db),
6a30: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6a40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6a50: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
6a60: 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  4);.    sqlite3V
6a70: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
6a80: 76 2c 20 6c 62 6c 29 3b 0a 0a 20 20 20 20 2f 2a  v, lbl);..    /*
6a90: 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61 74   This just creat
6aa0: 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65  es a place-holde
6ab0: 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  r record in the 
6ac0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
6ad0: 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ble..    ** The 
6ae0: 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20 64  record created d
6af0: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
6b00: 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49  anything yet.  I
6b10: 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63  t will be replac
6b20: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
6b30: 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63   real entry in c
6b40: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61 74  ode generated at
6b50: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
6b60: 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
6b70: 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
6b80: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73  the new entry is
6b90: 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 74 6f 70   left on the top
6ba0: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   of the stack.. 
6bb0: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
6bc0: 76 61 6c 75 65 20 69 73 20 6e 65 65 64 65 64 20  value is needed 
6bd0: 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  by the code that
6be0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
6bf0: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e   will.    ** gen
6c00: 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69  erate..    */.#i
6c10: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
6c20: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
6c30: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6c40: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
6c50: 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65  E).    if( isVie
6c60: 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29  w || isVirtual )
6c70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6c80: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6c90: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
6ca0: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
6cb0: 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69      {.      sqli
6cc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6cd0: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20  OP_CreateTable, 
6ce0: 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  iDb, 0);.    }. 
6cf0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
6d00: 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65  sterTable(pParse
6d10: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
6d20: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6d30: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20  OP_NewRowid, 0, 
6d40: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
6d50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
6d60: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  up, 0, 0);.    s
6d70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6d80: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
6d90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6da0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
6db0: 73 65 72 74 2c 20 30 2c 20 4f 50 46 4c 41 47 5f  sert, 0, OPFLAG_
6dc0: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c  APPEND);.    sql
6dd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6de0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
6df0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6e00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
6e10: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  l, 1, 0);.  }.. 
6e20: 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d   /* Normal (non-
6e30: 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a  error) return. *
6e40: 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  /.  return;..  /
6e50: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
6e60: 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65  curs, we jump he
6e70: 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c  re */.begin_tabl
6e80: 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74  e_error:.  sqlit
6e90: 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
6ea0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
6eb0: 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73  ** This macro is
6ec0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65   used to compare
6ed0: 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69 6e 20   two strings in 
6ee0: 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69  a case-insensiti
6ef0: 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74  ve manner..** It
6f00: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61 73   is slightly fas
6f10: 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67  ter than calling
6f20: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6f30: 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75 74 0a  ) directly, but.
6f40: 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61 72 67  ** produces larg
6f50: 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57  er code..**.** W
6f60: 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61 63  ARNING: This mac
6f70: 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74  ro is not compat
6f80: 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 74  ible with the st
6f90: 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20 49  rcmp() family. I
6fa0: 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72 75  t.** returns tru
6fb0: 65 20 69 66 20 74 68 65 20 74 77 6f 20 73 74 72  e if the two str
6fc0: 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c 2c 20  ings are equal, 
6fd0: 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e  otherwise false.
6fe0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 52 49  .*/.#define STRI
6ff0: 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c  CMP(x, y) (\.sql
7000: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
7010: 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  [*(unsigned char
7020: 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71   *)(x)]==   \.sq
7030: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
7040: 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  r[*(unsigned cha
7050: 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a 26  r *)(y)]     \.&
7060: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
7070: 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30  ((x)+1,(y)+1)==0
7080: 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20   )../*.** Add a 
7090: 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68  new column to th
70a0: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
70b0: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
70c0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
70d0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
70e0: 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f   routine once fo
70f0: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65  r each column de
7100: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  claration.** in 
7110: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
7120: 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74  tatement.  sqlit
7130: 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67  e3StartTable() g
7140: 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69  ets called.** fi
7150: 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67  rst to get thing
7160: 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74  s going.  Then t
7170: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7180: 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a  alled for each.*
7190: 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69  * column..*/.voi
71a0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
71b0: 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mn(Parse *pParse
71c0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
71d0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
71e0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt i;.  char *z;
71f0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
7200: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
7210: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
7220: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
7230: 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 53 51 4c 49  ( p->nCol+1>SQLI
7240: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 7b  TE_MAX_COLUMN ){
7250: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7260: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
7270: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f  o many columns o
7280: 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  n %s", p->zName)
7290: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
72a0: 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  }.  z = sqlite3N
72b0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
72c0: 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b  rse->db, pName);
72d0: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
72e0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
72f0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
7300: 7b 0a 20 20 20 20 69 66 28 20 53 54 52 49 43 4d  {.    if( STRICM
7310: 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  P(z, p->aCol[i].
7320: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
7330: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7340: 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61  pParse, "duplica
7350: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  te column name: 
7360: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73  %s", z);.      s
7370: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
7380: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
7390: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
73a0: 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30  ->nCol & 0x7)==0
73b0: 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a   ){.    Column *
73c0: 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d  aNew;.    aNew =
73d0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
73e0: 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 70 2d 3e  c(pParse->db,p->
73f0: 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29  aCol,(p->nCol+8)
7400: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b  *sizeof(p->aCol[
7410: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  0]));.    if( aN
7420: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
7430: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
7440: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
7450: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20    }.    p->aCol 
7460: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
7470: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
7480: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
7490: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
74a0: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
74b0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
74c0: 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  ;. .  /* If ther
74d0: 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65  e is no type spe
74e0: 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20  cified, columns 
74f0: 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74  have the default
7500: 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27   affinity.  ** '
7510: 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20  NONE'. If there 
7520: 69 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66  is a type specif
7530: 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65  ied, then sqlite
7540: 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29  3AddColumnType()
7550: 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61   will.  ** be ca
7560: 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74  lled next to set
7570: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
7580: 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a  correctly..  */.
7590: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
75a0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
75b0: 4e 45 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b  NE;.  p->nCol++;
75c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
75d0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
75e0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
75f0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
7600: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
7610: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
7620: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
7630: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
7640: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
7650: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
7660: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
7670: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
7680: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
7690: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
76a0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
76b0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
76c0: 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  ite3AddNotNull(P
76d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
76e0: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
76f0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
7700: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
7710: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
7720: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
7730: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
7740: 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f  f( i>=0 ) p->aCo
7750: 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f  l[i].notNull = o
7760: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
7770: 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e   Scan the column
7780: 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65   type name zType
7790: 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20   (length nType) 
77a0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  and return the.*
77b0: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66  * associated aff
77c0: 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a  inity type..**.*
77d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
77e0: 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70  oes a case-indep
77f0: 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66  endent search of
7800: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a   zType for the .
7810: 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  ** substrings in
7820: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
7830: 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20  able. If one of 
7840: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
7850: 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20  s.** found, the 
7860: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66  corresponding af
7870: 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e  finity is return
7880: 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e  ed. If zType con
7890: 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68  tains.** more th
78a0: 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  an one of the su
78b0: 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65  bstrings, entrie
78c0: 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70  s toward the top
78d0: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c   of .** the tabl
78e0: 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e  e take priority.
78f0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
7900: 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49   zType is 'BLOBI
7910: 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  NT', .** SQLITE_
7920: 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72  AFF_INTEGER is r
7930: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  eturned..**.** S
7940: 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41  ubstring     | A
7950: 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d  ffinity.** -----
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27  -----------.** '
7980: 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53  INT'         | S
7990: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
79a0: 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20  R.** 'CHAR'     
79b0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
79c0: 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20  TEXT.** 'CLOB'  
79d0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
79e0: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54  FF_TEXT.** 'TEXT
79f0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7a00: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42  E_AFF_TEXT.** 'B
7a10: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
7a20: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a  LITE_AFF_NONE.**
7a30: 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c   'REAL'        |
7a40: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
7a50: 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20  .** 'FLOA'      
7a60: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
7a70: 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20  EAL.** 'DOUB'   
7a80: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7a90: 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20  F_REAL.**.** If 
7aa0: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73  none of the subs
7ab0: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62  trings in the ab
7ac0: 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f  ove table are fo
7ad0: 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  und,.** SQLITE_A
7ae0: 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65  FF_NUMERIC is re
7af0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20  turned..*/.char 
7b00: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
7b10: 79 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  ype(const Token 
7b20: 2a 70 54 79 70 65 29 7b 0a 20 20 75 33 32 20 68  *pType){.  u32 h
7b30: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
7b40: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
7b50: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 75  MERIC;.  const u
7b60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
7b70: 6e 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a 20 20  n = pType->z;.  
7b80: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
7b90: 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70 54 79  har *zEnd = &pTy
7ba0: 70 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d 3b  pe->z[pType->n];
7bb0: 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d  ..  while( zIn!=
7bc0: 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d 20  zEnd ){.    h = 
7bd0: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
7be0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49  UpperToLower[*zI
7bf0: 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20  n];.    zIn++;. 
7c00: 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c     if( h==(('c'<
7c10: 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28  <24)+('h'<<16)+(
7c20: 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20  'a'<<8)+'r') ){ 
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7c40: 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  HAR */.      aff
7c50: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
7c60: 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20 69  XT; .    }else i
7c70: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
7c80: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
7c90: 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20  <8)+'b') ){     
7ca0: 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20    /* CLOB */.   
7cb0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7cc0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
7cd0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27  lse if( h==(('t'
7ce0: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
7cf0: 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('x'<<8)+'t') ){
7d00: 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a         /* TEXT *
7d10: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
7d20: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
7d30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
7d40: 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('b'<<24)+('l'<
7d50: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
7d60: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ')          /* B
7d70: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOB */.        &
7d80: 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  & (aff==SQLITE_A
7d90: 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66  FF_NUMERIC || af
7da0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f==SQLITE_AFF_RE
7db0: 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66  AL) ){.      aff
7dc0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
7dd0: 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  NE;.#ifndef SQLI
7de0: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
7df0: 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65  _POINT.    }else
7e00: 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32   if( h==(('r'<<2
7e10: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61  4)+('e'<<16)+('a
7e20: 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20  '<<8)+'l')      
7e30: 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20      /* REAL */. 
7e40: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
7e50: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
7e60: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
7e70: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
7e80: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7e90: 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27  h==(('f'<<24)+('
7ea0: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
7eb0: 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'a')          /
7ec0: 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20  * FLOA */.      
7ed0: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
7ee0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
7ef0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
7f00: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
7f10: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
7f20: 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31  'd'<<24)+('o'<<1
7f30: 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29  6)+('u'<<8)+'b')
7f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55            /* DOU
7f50: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
7f60: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
7f70: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
7f80: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7f90: 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20  F_REAL;.#endif. 
7fa0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26     }else if( (h&
7fb0: 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27  0x00FFFFFF)==(('
7fc0: 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29  i'<<16)+('n'<<8)
7fd0: 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49  +'t') ){    /* I
7fe0: 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  NT */.      aff 
7ff0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
8000: 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61  EGER;.      brea
8010: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
8020: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
8030: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8040: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
8050: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
8060: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
8070: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
8080: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
8090: 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73  ment.  The pFirs
80a0: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66  t token is the f
80b0: 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e  irst.** token in
80c0: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66   the sequence of
80d0: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73   tokens that des
80e0: 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f  cribe the type o
80f0: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
8100: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
8110: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20  construction.   
8120: 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73  pLast is the las
8130: 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68  t token.** in th
8140: 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65  e sequence.  Use
8150: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
8160: 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  n to construct a
8170: 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20   string.** that 
8180: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70  contains the typ
8190: 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c  ename of the col
81a0: 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  umn and store th
81b0: 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20  at string.** in 
81c0: 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20  zType..*/ .void 
81d0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
81e0: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
81f0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65  se, Token *pType
8200: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
8210: 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e   int i;.  Column
8220: 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 28   *pCol;..  if( (
8230: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
8240: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
8250: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
8260: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29  l-1;.  if( i<0 )
8270: 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20   return;.  pCol 
8280: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20  = &p->aCol[i];. 
8290: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
82a0: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 70 43  ol->zType);.  pC
82b0: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
82c0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
82d0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 79  (pParse->db, pTy
82e0: 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66  pe);.  pCol->aff
82f0: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41  inity = sqlite3A
8300: 66 66 69 6e 69 74 79 54 79 70 65 28 70 54 79 70  ffinityType(pTyp
8310: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
8320: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
8330: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
8340: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
8350: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
8360: 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61  umn.** of the ta
8370: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
8380: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
8390: 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20  ..**.** Default 
83a0: 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e  value expression
83b0: 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61  s must be consta
83c0: 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78  nt.  Raise an ex
83d0: 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a  ception if this.
83e0: 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  ** is not the ca
83f0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
8400: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8410: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
8420: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
8430: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
8440: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
8450: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
8460: 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66  id sqlite3AddDef
8470: 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20  aultValue(Parse 
8480: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
8490: 45 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Expr){.  Table *
84a0: 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  p;.  Column *pCo
84b0: 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  l;.  if( (p = pP
84c0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
84d0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20  !=0 ){.    pCol 
84e0: 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  = &(p->aCol[p->n
84f0: 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28  Col-1]);.    if(
8500: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
8510: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
8520: 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
8530: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8540: 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75  g(pParse, "defau
8550: 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75  lt value of colu
8560: 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63  mn [%s] is not c
8570: 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20  onstant",.      
8580: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29      pCol->zName)
8590: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
85a0: 20 20 20 45 78 70 72 20 2a 70 43 6f 70 79 3b 0a     Expr *pCopy;.
85b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
85c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
85d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
85e0: 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44  rDelete(pCol->pD
85f0: 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  flt);.      pCol
8600: 2d 3e 70 44 66 6c 74 20 3d 20 70 43 6f 70 79 20  ->pDflt = pCopy 
8610: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
8620: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
8630: 20 20 20 69 66 28 20 70 43 6f 70 79 20 29 7b 0a     if( pCopy ){.
8640: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
8650: 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 43  okenCopy(db, &pC
8660: 6f 70 79 2d 3e 73 70 61 6e 2c 20 26 70 45 78 70  opy->span, &pExp
8670: 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20  r->span);.      
8680: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
8690: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
86a0: 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
86b0: 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50   Designate the P
86c0: 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74  RIMARY KEY for t
86d0: 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74  he table.  pList
86e0: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61   is a list of na
86f0: 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d  mes .** of colum
8700: 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ns that form the
8710: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
8720: 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c  f pList is NULL,
8730: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73   then the.** mos
8740: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
8750: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74   column of the t
8760: 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d  able is the prim
8770: 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  ary key..**.** A
8780: 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20   table can have 
8790: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d  at most one prim
87a0: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65  ary key.  If the
87b0: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
87c0: 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20  as.** a primary 
87d0: 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73  key (and this is
87e0: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d   the second prim
87f0: 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72  ary key) then cr
8800: 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eate an.** error
8810: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
8820: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e  RIMARY KEY is on
8830: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
8840: 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20   whose datatype 
8850: 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74  is INTEGER,.** t
8860: 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20  hen we will try 
8870: 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75  to use that colu
8880: 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e  mn as the rowid.
8890: 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e    Set the Table.
88a0: 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f  iPKey.** field o
88b0: 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  f the table unde
88c0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74  r construction t
88d0: 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f  o be the index o
88e0: 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52  f the.** INTEGER
88f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
8900: 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65  umn.  Table.iPKe
8910: 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69  y is set to -1 i
8920: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  f there is.** no
8930: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
8940: 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   KEY..**.** If t
8950: 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e  he key is not an
8960: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
8970: 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74   KEY, then creat
8980: 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e  e a unique.** in
8990: 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e  dex for the key.
89a0: 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72    No index is cr
89b0: 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45  eated for INTEGE
89c0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a  R PRIMARY KEYs..
89d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
89e0: 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20  ddPrimaryKey(.  
89f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8a00: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
8a10: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
8a20: 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c  st *pList,  /* L
8a30: 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d  ist of field nam
8a40: 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  es to be indexed
8a50: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
8a60: 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  r,      /* What 
8a70: 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69  to do with a uni
8a80: 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74  queness conflict
8a90: 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e   */.  int autoIn
8aa0: 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  c,      /* True 
8ab0: 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45  if the AUTOINCRE
8ac0: 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20  MENT keyword is 
8ad0: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
8ae0: 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f   sortOrder     /
8af0: 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20  * SQLITE_SO_ASC 
8b00: 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  or SQLITE_SO_DES
8b10: 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  C */.){.  Table 
8b20: 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  *pTab = pParse->
8b30: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61  pNewTable;.  cha
8b40: 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  r *zType = 0;.  
8b50: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69  int iCol = -1, i
8b60: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
8b70: 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
8b80: 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72  AB ) goto primar
8b90: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66  y_key_exit;.  if
8ba0: 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b  ( pTab->hasPrimK
8bb0: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
8bc0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8bd0: 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20  , .      "table 
8be0: 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20  \"%s\" has more 
8bf0: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
8c00: 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   key", pTab->zNa
8c10: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72  me);.    goto pr
8c20: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
8c30: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50    }.  pTab->hasP
8c40: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66  rimKey = 1;.  if
8c50: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
8c60: 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e    iCol = pTab->n
8c70: 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61  Col - 1;.    pTa
8c80: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73  b->aCol[iCol].is
8c90: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d  PrimKey = 1;.  }
8ca0: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
8cb0: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
8cc0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  r; i++){.      f
8cd0: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
8ce0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
8cf0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
8d00: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
8d10: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
8d20: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e, pTab->aCol[iC
8d30: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ol].zName)==0 ){
8d40: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
8d50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8d60: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
8d70: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
8d80: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61  .        pTab->a
8d90: 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d  Col[iCol].isPrim
8da0: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Key = 1;.      }
8db0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
8dc0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20  List->nExpr>1 ) 
8dd0: 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  iCol = -1;.  }. 
8de0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
8df0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
8e00: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70  ){.    zType = p
8e10: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
8e20: 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28  zType;.  }.  if(
8e30: 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65   zType && sqlite
8e40: 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20  3StrICmp(zType, 
8e50: 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20  "INTEGER")==0.  
8e60: 20 20 20 20 20 20 26 26 20 73 6f 72 74 4f 72 64        && sortOrd
8e70: 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  er==SQLITE_SO_AS
8e80: 43 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69  C ){.    pTab->i
8e90: 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  PKey = iCol;.   
8ea0: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d   pTab->keyConf =
8eb0: 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 70 54   onError;.    pT
8ec0: 61 62 2d 3e 61 75 74 6f 49 6e 63 20 3d 20 61 75  ab->autoInc = au
8ed0: 74 6f 49 6e 63 3b 0a 20 20 7d 65 6c 73 65 20 69  toInc;.  }else i
8ee0: 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69  f( autoInc ){.#i
8ef0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8f00: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
8f10: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8f20: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54  Msg(pParse, "AUT
8f30: 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e  OINCREMENT is on
8f40: 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e  ly allowed on an
8f50: 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47   ".       "INTEG
8f60: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29  ER PRIMARY KEY")
8f70: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
8f80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
8f90: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
8fa0: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
8fb0: 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 2c 20   onError, 0, 0, 
8fc0: 73 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20  sortOrder, 0);. 
8fd0: 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20     pList = 0;.  
8fe0: 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  }..primary_key_e
8ff0: 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  xit:.  sqlite3Ex
9000: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  prListDelete(pLi
9010: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  st);.  return;.}
9020: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
9030: 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  w CHECK constrai
9040: 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  nt to the table 
9050: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
9060: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
9070: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
9080: 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28  CheckConstraint(
9090: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
90a0: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
90b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
90c0: 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f  r *pCheckExpr  /
90d0: 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72  * The check expr
90e0: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66  ession */.){.#if
90f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9100: 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a  _CHECK.  Table *
9110: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
9120: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69  NewTable;.  sqli
9130: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9140: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 54 61 62  ->db;.  if( pTab
9150: 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f   && !IN_DECLARE_
9160: 56 54 41 42 20 29 7b 0a 20 20 20 20 2f 2a 20 54  VTAB ){.    /* T
9170: 68 65 20 43 48 45 43 4b 20 65 78 70 72 65 73 73  he CHECK express
9180: 69 6f 6e 20 6d 75 73 74 20 62 65 20 64 75 70 6c  ion must be dupl
9190: 69 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  icated so that t
91a0: 6f 6b 65 6e 73 20 72 65 66 65 72 0a 20 20 20 20  okens refer.    
91b0: 2a 2a 20 74 6f 20 6d 61 6c 6c 6f 63 65 64 20 73  ** to malloced s
91c0: 70 61 63 65 20 61 6e 64 20 6e 6f 74 20 74 68 65  pace and not the
91d0: 20 28 65 70 68 65 6d 65 72 61 6c 29 20 74 65 78   (ephemeral) tex
91e0: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
91f0: 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 73 74 61  TABLE.    ** sta
9200: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 70 54  tement */.    pT
9210: 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c  ab->pCheck = sql
9220: 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
9230: 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 0a 20  pTab->pCheck, . 
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9260: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9270: 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 29  db, pCheckExpr))
9280: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
9290: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
92a0: 28 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 7d 0a  (pCheckExpr);.}.
92b0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
92c0: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
92d0: 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
92e0: 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61  cently parsed ta
92f0: 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f  ble column.** to
9300: 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76   the CollSeq giv
9310: 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  en..*/.void sqli
9320: 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70  te3AddCollateTyp
9330: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
9340: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
9350: 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a  pe, int nType){.
9360: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
9370: 74 20 69 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  t i;..  if( (p =
9380: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9390: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
93a0: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
93b0: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
93c0: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
93d0: 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79  arse, zType, nTy
93e0: 70 65 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  pe) ){.    Index
93f0: 20 2a 70 49 64 78 3b 0a 20 20 20 20 70 2d 3e 61   *pIdx;.    p->a
9400: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 73  Col[i].zColl = s
9410: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
9420: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54 79 70  pParse->db, zTyp
9430: 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20 0a 20 20  e, nType);.  .  
9440: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
9450: 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61  mn is declared a
9460: 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52  s "<name> PRIMAR
9470: 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74  Y KEY COLLATE <t
9480: 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68  ype>",.    ** th
9490: 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20  en an index may 
94a0: 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65  have been create
94b0: 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e  d on this column
94c0: 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20   before the.    
94d0: 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70  ** collation typ
94e0: 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72  e was added. Cor
94f0: 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20  rect this if it 
9500: 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20  is the case..   
9510: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78   */.    for(pIdx
9520: 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  =p->pIndex; pIdx
9530: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
9540: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
9550: 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
9560: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
9570: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
9580: 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20  0]==i ){.       
9590: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
95a0: 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43   = p->aCol[i].zC
95b0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
95c0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
95d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
95e0: 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74  turns the collat
95f0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
9600: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
9610: 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e   text.** encodin
9620: 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  g identified by 
9630: 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  the string zName
9640: 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a  , length nName..
9650: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
9660: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
9670: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74   sequence is not
9680: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e   available, or n
9690: 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  ot available.** 
96a0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
96b0: 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c  native encoding,
96c0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
96d0: 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65  actory is invoke
96e0: 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20  d to.** request 
96f0: 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61  it. If the colla
9700: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65  tion factory doe
9710: 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63  s not supply suc
9720: 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a  h a sequence,.**
9730: 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63   and the sequenc
9740: 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  e is available i
9750: 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65  n another text e
9760: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68  ncoding, then th
9770: 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  at is.** returne
9780: 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
9790: 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20   If no versions 
97a0: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  of the requested
97b0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75   collations sequ
97c0: 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62  ence are availab
97d0: 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65  le, or.** anothe
97e0: 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  r error occurs, 
97f0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
9800: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65   and an error me
9810: 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e  ssage written in
9820: 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a  to.** pParse..**
9830: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9840: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
9850: 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64  ound sqlite3Find
9860: 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73  CollSeq().  This
9870: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f   routine.** invo
9880: 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  kes the collatio
9890: 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68 65  n factory if the
98a0: 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e   named collation
98b0: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
98c0: 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
98d0: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
98e0: 67 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  ge..*/.CollSeq *
98f0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
9900: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
9910: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
9920: 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65  zName, int nName
9930: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
9940: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
9950: 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
9960: 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  );.  u8 initbusy
9970: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79   = db->init.busy
9980: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
9990: 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73  ll;..  pColl = s
99a0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
99b0: 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65  q(db, enc, zName
99c0: 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73  , nName, initbus
99d0: 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62  y);.  if( !initb
99e0: 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c  usy && (!pColl |
99f0: 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20  | !pColl->xCmp) 
9a00: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
9a10: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
9a20: 28 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d  (db, pColl, zNam
9a30: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69  e, nName);.    i
9a40: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
9a50: 20 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29     if( nName<0 )
9a60: 7b 0a 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20  {.        nName 
9a70: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
9a80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
9a90: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9aa0: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
9ab0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9ac0: 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65  ce: %.*s", nName
9ad0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
9ae0: 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  pColl = 0;.    }
9af0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
9b00: 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Coll;.}.../*.** 
9b10: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
9b20: 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e  at will incremen
9b30: 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  t the schema coo
9b40: 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  kie..**.** The s
9b50: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20  chema cookie is 
9b60: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
9b70: 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d  e when the schem
9b80: 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74  a for the.** dat
9b90: 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
9ba0: 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d  After each schem
9bb0: 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f  a change, the co
9bc0: 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68  okie value.** ch
9bd0: 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70  anges.  When a p
9be0: 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61  rocess first rea
9bf0: 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74  ds the schema it
9c00: 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20   records the.** 
9c10: 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66  cookie.  Thereaf
9c20: 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74  ter, whenever it
9c30: 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20   goes to access 
9c40: 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a  the database,.**
9c50: 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63   it checks the c
9c60: 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75  ookie to make su
9c70: 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61  re the schema ha
9c80: 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a  s not changed.**
9c90: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61   since it was la
9ca0: 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  st read..**.** T
9cb0: 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20  his plan is not 
9cc0: 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65  completely bulle
9cd0: 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20  t-proof.  It is 
9ce0: 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20  possible for.** 
9cf0: 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68  the schema to ch
9d00: 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69  ange multiple ti
9d10: 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20  mes and for the 
9d20: 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20  cookie to be.** 
9d30: 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f  set back to prio
9d40: 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63  r value.  But sc
9d50: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65  hema changes are
9d60: 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61   infrequent.** a
9d70: 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  nd the probabili
9d80: 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68  ty of hitting th
9d90: 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61  e same cookie va
9da0: 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31  lue is only.** 1
9db0: 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e   chance in 2^32.
9dc0: 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20    So we're safe 
9dd0: 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20  enough..*/.void 
9de0: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
9df0: 6b 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  kie(sqlite3 *db,
9e00: 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44   Vdbe *v, int iD
9e10: 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b){.  sqlite3Vdb
9e20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
9e30: 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44  eger, db->aDb[iD
9e40: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b].pSchema->sche
9e50: 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b  ma_cookie+1, 0);
9e60: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
9e70: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
9e80: 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a  kie, iDb, 0);.}.
9e90: 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74  ./*.** Measure t
9ea0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
9eb0: 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74  racters needed t
9ec0: 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76  o output the giv
9ed0: 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  en.** identifier
9ee0: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65  .  The number re
9ef0: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
9f00: 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a  any quotes used.
9f10: 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ** but does not 
9f20: 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c  include the null
9f30: 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a   terminator..**.
9f40: 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20  ** The estimate 
9f50: 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e  is conservative.
9f60: 20 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61    It might be la
9f70: 72 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69  rger that what i
9f80: 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64  s.** really need
9f90: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
9fa0: 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f  t identLength(co
9fb0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
9fc0: 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30  int n;.  for(n=0
9fd0: 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b  ; *z; n++, z++){
9fe0: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27  .    if( *z=='"'
9ff0: 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20   ){ n++; }.  }. 
a000: 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d   return n + 2;.}
a010: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
a020: 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f   identifier onto
a030: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a040: 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41  given string.  A
a050: 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72  dd.** quote char
a060: 61 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64  acters as needed
a070: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a080: 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a   identPut(char *
a090: 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68  z, int *pIdx, ch
a0a0: 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar *zSignedIdent
a0b0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
a0c0: 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e  ar *zIdent = (un
a0d0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69  signed char*)zSi
a0e0: 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74  gnedIdent;.  int
a0f0: 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65   i, j, needQuote
a100: 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20  ;.  i = *pIdx;. 
a110: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
a120: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  [j]; j++){.    i
a130: 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65  f( !isalnum(zIde
a140: 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74  nt[j]) && zIdent
a150: 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b  [j]!='_' ) break
a160: 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74  ;.  }.  needQuot
a170: 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  e =  zIdent[j]!=
a180: 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a 49 64  0 || isdigit(zId
a190: 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20  ent[0]).        
a1a0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
a1b0: 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28  ite3KeywordCode(
a1c0: 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49  zIdent, j)!=TK_I
a1d0: 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f  D;.  if( needQuo
a1e0: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
a1f0: 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ';.  for(j=0; zI
a200: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
a210: 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65     z[i++] = zIde
a220: 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a  nt[j];.    if( z
a230: 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20  Ident[j]=='"' ) 
a240: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
a250: 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  }.  if( needQuot
a260: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
a270: 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20  ;.  z[i] = 0;.  
a280: 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a  *pIdx = i;.}../*
a290: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43  .** Generate a C
a2a0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
a2b0: 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74  ement appropriat
a2c0: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
a2d0: 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72  ** table.  Memor
a2e0: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65  y to hold the te
a2f0: 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  xt of the statem
a300: 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ent is obtained.
a310: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ** from sqliteMa
a320: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
a330: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
a340: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
a350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
a360: 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d   *createTableStm
a370: 74 28 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20  t(Table *p, int 
a380: 69 73 54 65 6d 70 29 7b 0a 20 20 69 6e 74 20 69  isTemp){.  int i
a390: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
a3a0: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
a3b0: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
a3c0: 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e  nd, *z;.  Column
a3d0: 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b   *pCol;.  n = 0;
a3e0: 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d  .  for(pCol = p-
a3f0: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
a400: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
a410: 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64  ++){.    n += id
a420: 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e  entLength(pCol->
a430: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20  zName);.    z = 
a440: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20  pCol->zType;.   
a450: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
a460: 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20  n += (strlen(z) 
a470: 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  + 1);.    }.  }.
a480: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
a490: 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  th(p->zName);.  
a4a0: 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20  if( n<50 ){.    
a4b0: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a  zSep = "";.    z
a4c0: 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20  Sep2 = ",";.    
a4d0: 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65  zEnd = ")";.  }e
a4e0: 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20  lse{.    zSep = 
a4f0: 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70  "\n  ";.    zSep
a500: 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20  2 = ",\n  ";.   
a510: 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20   zEnd = "\n)";. 
a520: 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36   }.  n += 35 + 6
a530: 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d  *p->nCol;.  zStm
a540: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
a550: 6f 63 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a  oc( n );.  if( z
a560: 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  Stmt==0 ) return
a570: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e   0;.  sqlite3_sn
a580: 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c  printf(n, zStmt,
a590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a5a0: 20 20 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 26     !OMIT_TEMPDB&
a5b0: 26 69 73 54 65 6d 70 20 3f 20 22 43 52 45 41 54  &isTemp ? "CREAT
a5c0: 45 20 54 45 4d 50 20 54 41 42 4c 45 20 22 3a 22  E TEMP TABLE ":"
a5d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b  CREATE TABLE ");
a5e0: 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53  .  k = strlen(zS
a5f0: 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74  tmt);.  identPut
a600: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a  (zStmt, &k, p->z
a610: 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b  Name);.  zStmt[k
a620: 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72  ++] = '(';.  for
a630: 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69  (pCol=p->aCol, i
a640: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
a650: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
a660: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
a670: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
a680: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b  , zSep);.    k +
a690: 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b  = strlen(&zStmt[
a6a0: 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  k]);.    zSep = 
a6b0: 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74  zSep2;.    ident
a6c0: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
a6d0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
a6e0: 20 69 66 28 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e   if( (z = pCol->
a6f0: 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a 20 20 20  zType)!=0 ){.   
a700: 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20     zStmt[k++] = 
a710: 27 20 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ' ';.      asser
a720: 74 28 20 73 74 72 6c 65 6e 28 7a 29 2b 6b 2b 31  t( strlen(z)+k+1
a730: 3c 3d 6e 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  <=n );.      sql
a740: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
a750: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25  k, &zStmt[k], "%
a760: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 6b 20  s", z);.      k 
a770: 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20  += strlen(z);.  
a780: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
a790: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20  3_snprintf(n-k, 
a7a0: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c  &zStmt[k], "%s",
a7b0: 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e   zEnd);.  return
a7c0: 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zStmt;.}../*.**
a7d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a7e0: 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72   called to repor
a7f0: 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20  t the final ")" 
a800: 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a  that terminates.
a810: 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ** a CREATE TABL
a820: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
a830: 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72  ** The table str
a840: 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65  ucture that othe
a850: 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  r action routine
a860: 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c  s have been buil
a870: 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64  ding.** is added
a880: 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   to the internal
a890: 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73   hash tables, as
a8a0: 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73  suming no errors
a8b0: 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65   have.** occurre
a8c0: 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72  d..**.** An entr
a8d0: 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  y for the table 
a8e0: 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d  is made in the m
a8f0: 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64  aster table on d
a900: 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74  isk, unless.** t
a910: 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
a920: 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e  ry table or db->
a930: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57  init.busy==1.  W
a940: 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  hen db->init.bus
a950: 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73  y==1.** it means
a960: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
a970: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
a980: 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20  r table because 
a990: 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65  we just.** conne
a9a0: 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  cted to the data
a9b0: 62 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20  base or because 
a9c0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
a9d0: 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72  r table has.** r
a9e0: 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c  ecently changed,
a9f0: 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f   so the entry fo
aa00: 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72  r this table alr
aa10: 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a  eady exists in.*
aa20: 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  * the sqlite_mas
aa30: 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64  ter table.  We d
aa40: 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72  o not want to cr
aa50: 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a  eate it again..*
aa60: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c  *.** If the pSel
aa70: 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ect argument is 
aa80: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61  not NULL, it mea
aa90: 6e 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ns that this rou
aaa0: 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c  tine.** was call
aab0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74  ed to create a t
aac0: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66  able generated f
aad0: 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54  rom a .** "CREAT
aae0: 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53  E TABLE ... AS S
aaf0: 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65  ELECT ..." state
ab00: 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d  ment.  The colum
ab10: 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  n names of.** th
ab20: 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c  e new table will
ab30: 20 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c   match the resul
ab40: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
ab50: 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
ab60: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20  ite3EndTable(.  
ab70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
ab80: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
ab90: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
aba0: 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20  ken *pCons,     
abb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27        /* The ','
abc0: 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65   token after the
abd0: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66   last column def
abe0: 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  n. */.  Token *p
abf0: 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  End,            
ac00: 2f 2a 20 54 68 65 20 66 69 6e 61 6c 20 27 29 27  /* The final ')'
ac10: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 43 52   token in the CR
ac20: 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20  EATE TABLE */.  
ac30: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
ac40: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
ac50: 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45  t from a "CREATE
ac60: 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20   ... AS SELECT" 
ac70: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
ac80: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
ac90: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
aca0: 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20  int iDb;..  if( 
acb0: 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c  (pEnd==0 && pSel
acc0: 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73  ect==0) || pPars
acd0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
ace0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a  allocFailed ) {.
acf0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
ad00: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
ad10: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
ad20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
ad30: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
ad40: 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c  it.busy || !pSel
ad50: 65 63 74 20 29 3b 0a 0a 20 20 69 44 62 20 3d 20  ect );..  iDb = 
ad60: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
ad70: 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68  ndex(db, p->pSch
ad80: 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ema);..#ifndef S
ad90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
ada0: 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61  .  /* Resolve na
adb0: 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b  mes in all CHECK
adc0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72   constraint expr
add0: 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  essions..  */.  
ade0: 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b  if( p->pCheck ){
adf0: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 73 53 72  .    SrcList sSr
ae00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
ae10: 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 53 72 63       /* Fake Src
ae20: 4c 69 73 74 20 66 6f 72 20 70 50 61 72 73 65 2d  List for pParse-
ae30: 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20  >pNewTable */.  
ae40: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
ae50: 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C;              
ae60: 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
ae70: 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e  t for pParse->pN
ae80: 65 77 54 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  ewTable */..    
ae90: 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
aea0: 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
aeb0: 20 20 6d 65 6d 73 65 74 28 26 73 53 72 63 2c 20    memset(&sSrc, 
aec0: 30 2c 20 73 69 7a 65 6f 66 28 73 53 72 63 29 29  0, sizeof(sSrc))
aed0: 3b 0a 20 20 20 20 73 53 72 63 2e 6e 53 72 63 20  ;.    sSrc.nSrc 
aee0: 3d 20 31 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b  = 1;.    sSrc.a[
aef0: 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e  0].zName = p->zN
af00: 61 6d 65 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b  ame;.    sSrc.a[
af10: 30 5d 2e 70 54 61 62 20 3d 20 70 3b 0a 20 20 20  0].pTab = p;.   
af20: 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75 72 73   sSrc.a[0].iCurs
af30: 6f 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 4e 43  or = -1;.    sNC
af40: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
af50: 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69  ;.    sNC.pSrcLi
af60: 73 74 20 3d 20 26 73 53 72 63 3b 0a 20 20 20 20  st = &sSrc;.    
af70: 73 4e 43 2e 69 73 43 68 65 63 6b 20 3d 20 31 3b  sNC.isCheck = 1;
af80: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
af90: 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
afa0: 28 26 73 4e 43 2c 20 70 2d 3e 70 43 68 65 63 6b  (&sNC, p->pCheck
afb0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
afc0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  n;.    }.  }.#en
afd0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
afe0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
aff0: 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  K) */..  /* If t
b000: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
b010: 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77   is 1 it means w
b020: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
b030: 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20  e SQL off the.  
b040: 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  ** "sqlite_maste
b050: 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65  r" or "sqlite_te
b060: 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65  mp_master" table
b070: 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20   on the disk..  
b080: 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69  ** So do not wri
b090: 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  te to the disk a
b0a0: 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74  gain.  Extract t
b0b0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
b0c0: 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ber.  ** for the
b0d0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
b0e0: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
b0f0: 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61   field.  (The pa
b100: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73  ge number.  ** s
b110: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
b120: 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65  put there by the
b130: 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f   sqliteOpenCb ro
b140: 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69  utine.).  */.  i
b150: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
b160: 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20   ){.    p->tnum 
b170: 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
b180: 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  um;.  }..  /* If
b190: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   not initializin
b1a0: 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  g, then create a
b1b0: 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20   record for the 
b1c0: 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69  new table.  ** i
b1d0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  n the SQLITE_MAS
b1e0: 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65  TER table of the
b1f0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
b200: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20  record number.  
b210: 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  ** for the new t
b220: 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c  able entry shoul
b230: 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20  d already be on 
b240: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a  the stack..  **.
b250: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
b260: 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c  a TEMPORARY tabl
b270: 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74  e, write the ent
b280: 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69  ry into the auxi
b290: 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20  liary.  ** file 
b2a0: 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20  instead of into 
b2b0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
b2c0: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
b2d0: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
b2e0: 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  y ){.    int n;.
b2f0: 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
b300: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20   char *zType;   
b310: 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74   /* "view" or "t
b320: 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61  able" */.    cha
b330: 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20  r *zType2;   /* 
b340: 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45  "VIEW" or "TABLE
b350: 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  " */.    char *z
b360: 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74  Stmt;    /* Text
b370: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
b380: 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56  ABLE or CREATE V
b390: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  IEW statement */
b3a0: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
b3b0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
b3c0: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
b3d0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71   return;..    sq
b3e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b3f0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
b400: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  );..    /* Creat
b410: 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  e the rootpage f
b420: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
b430: 20 61 6e 64 20 70 75 73 68 20 69 74 20 6f 6e 74   and push it ont
b440: 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20  o the stack..   
b450: 20 2a 2a 20 41 20 76 69 65 77 20 68 61 73 20 6e   ** A view has n
b460: 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20 6a  o rootpage, so j
b470: 75 73 74 20 70 75 73 68 20 61 20 7a 65 72 6f 20  ust push a zero 
b480: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 66  onto the stack f
b490: 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65 77 73 2e  or.    ** views.
b4a0: 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79    Initialize zTy
b4b0: 70 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  pe at the same t
b4c0: 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ime..    */.    
b4d0: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d  if( p->pSelect==
b4e0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
b4f0: 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f  regular table */
b500: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
b510: 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54  table";.      zT
b520: 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a  ype2 = "TABLE";.
b530: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b540: 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c  MIT_VIEW.    }el
b550: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76  se{.      /* A v
b560: 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  iew */.      zTy
b570: 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20  pe = "view";.   
b580: 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45     zType2 = "VIE
b590: 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  W";.#endif.    }
b5a0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
b5b0: 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42   is a CREATE TAB
b5c0: 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20  LE xx AS SELECT 
b5d0: 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65  ..., execute the
b5e0: 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73   SELECT.    ** s
b5f0: 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75  tatement to popu
b600: 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62  late the new tab
b610: 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67  le. The root-pag
b620: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
b630: 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c  .    ** new tabl
b640: 65 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20  e is on the top 
b650: 6f 66 20 74 68 65 20 76 64 62 65 20 73 74 61 63  of the vdbe stac
b660: 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  k..    **.    **
b670: 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54   Once the SELECT
b680: 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20   has been coded 
b690: 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  by sqlite3Select
b6a0: 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20  (), it is in a. 
b6b0: 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73     ** suitable s
b6c0: 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f  tate to query fo
b6d0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
b6e0: 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20  es and types to 
b6f0: 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62  be used.    ** b
b700: 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  y the new table.
b710: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
b720: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72   shared-cache wr
b730: 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  ite-lock is not 
b740: 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74  required to writ
b750: 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62  e to the new tab
b760: 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20  le,.    ** as a 
b770: 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74  schema-lock must
b780: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
b790: 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63  en obtained to c
b7a0: 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a  reate it. Since.
b7b0: 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d      ** a schema-
b7c0: 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c  lock excludes al
b7d0: 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  l other database
b7e0: 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74   users, the writ
b7f0: 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20  e-lock would.   
b800: 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74   ** be redundant
b810: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
b820: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
b830: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
b840: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b850: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
b860: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
b870: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b880: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
b890: 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20   iDb, 0);.      
b8a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b8b0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
b8c0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 1, 0);.      p
b8d0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b  Parse->nTab = 2;
b8e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
b8f0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
b900: 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c  lect, SRT_Table,
b910: 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b   1, 0, 0, 0, 0);
b920: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b930: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
b940: 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ose, 1, 0);.    
b950: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
b960: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr==0 ){.       
b970: 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
b980: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
b990: 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ect(pParse, 0, p
b9a0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
b9b0: 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20   if( pSelTab==0 
b9c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
b9d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
b9e0: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l==0 );.        
b9f0: 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->nCol = pSelTa
ba00: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->nCol;.       
ba10: 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54   p->aCol = pSelT
ba20: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
ba30: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
ba40: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65  = 0;.        pSe
ba50: 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
ba60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
ba70: 65 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c 54  eleteTable(pSelT
ba80: 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ab);.      }.   
ba90: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75   }..    /* Compu
baa0: 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  te the complete 
bab0: 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
bac0: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  TE statement */.
bad0: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
bae0: 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  ){.      zStmt =
baf0: 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74   createTableStmt
bb00: 28 70 2c 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d  (p, p->pSchema==
bb10: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
bb20: 6d 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ma);.    }else{.
bb30: 20 20 20 20 20 20 6e 20 3d 20 70 45 6e 64 2d 3e        n = pEnd->
bb40: 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  z - pParse->sNam
bb50: 65 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20  eToken.z + 1;.  
bb60: 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
bb70: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a  te3MPrintf(db, .
bb80: 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
bb90: 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70  E %s %.*s", zTyp
bba0: 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73  e2, n, pParse->s
bbb0: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20  NameToken.z.    
bbc0: 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
bbd0: 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68  /* A slot for th
bbe0: 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72  e record has alr
bbf0: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
bc00: 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ted in the .    
bc10: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ** SQLITE_MASTER
bc20: 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74   table.  We just
bc30: 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20   need to update 
bc40: 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61  that slot with a
bc50: 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  ll.    ** the in
bc60: 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20  formation we've 
bc70: 63 6f 6c 6c 65 63 74 65 64 2e 20 20 54 68 65 20  collected.  The 
bc80: 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 70 72  rowid for the pr
bc90: 65 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a  eallocated.    *
bca0: 2a 20 73 6c 6f 74 20 69 73 20 74 68 65 20 32 6e  * slot is the 2n
bcb0: 64 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  d item on the st
bcc0: 61 63 6b 2e 20 20 54 68 65 20 74 6f 70 20 6f 66  ack.  The top of
bcd0: 20 74 68 65 20 73 74 61 63 6b 20 69 73 20 74 68   the stack is th
bce0: 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61  e.    ** root pa
bcf0: 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  ge for the new t
bd00: 61 62 6c 65 20 28 6f 72 20 61 20 30 20 69 66 20  able (or a 0 if 
bd10: 74 68 69 73 20 69 73 20 61 20 76 69 65 77 29 2e  this is a view).
bd20: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
bd30: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
bd40: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
bd50: 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
bd60: 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
bd70: 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
bd80: 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
bd90: 70 61 67 65 3d 23 30 2c 20 73 71 6c 3d 25 51 20  page=#0, sql=%Q 
bda0: 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20  ".       "WHERE 
bdb0: 72 6f 77 69 64 3d 23 31 22 2c 0a 20 20 20 20 20  rowid=#1",.     
bdc0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
bdd0: 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
bde0: 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54  E(iDb),.      zT
bdf0: 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e  ype,.      p->zN
be00: 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e  ame,.      p->zN
be10: 61 6d 65 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74  ame,.      zStmt
be20: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
be30: 74 65 33 5f 66 72 65 65 28 7a 53 74 6d 74 29 3b  te3_free(zStmt);
be40: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
be50: 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20  geCookie(db, v, 
be60: 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
be70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
be80: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20  NCREMENT.    /* 
be90: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
bea0: 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
beb0: 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75  e an sqlite_sequ
bec0: 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20  ence table for. 
bed0: 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72     ** keeping tr
bee0: 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65  ack of autoincre
bef0: 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a  ment keys..    *
bf00: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 75 74  /.    if( p->aut
bf10: 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 44 62  oInc ){.      Db
bf20: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
bf30: 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 69 66 28  [iDb];.      if(
bf40: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70   pDb->pSchema->p
bf50: 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  SeqTab==0 ){.   
bf60: 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
bf70: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
bf80: 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
bf90: 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74  E TABLE %Q.sqlit
bfa0: 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c  e_sequence(name,
bfb0: 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20  seq)",.         
bfc0: 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20   pDb->zName.    
bfd0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
bfe0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
bff0: 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72   /* Reparse ever
c000: 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65  ything to update
c010: 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61   our internal da
c020: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  ta structures */
c030: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c040: 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53  Op3(v, OP_ParseS
c050: 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a 20  chema, iDb, 0,. 
c060: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
c070: 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e  rintf(db, "tbl_n
c080: 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61  ame='%q'",p->zNa
c090: 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29  me), P3_DYNAMIC)
c0a0: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64  ;.  }...  /* Add
c0b0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68   the table to th
c0c0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
c0d0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
c0e0: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  e database..  */
c0f0: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
c100: 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e  busy && pParse->
c110: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54  nErr==0 ){.    T
c120: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
c130: 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20  FKey *pFKey; .  
c140: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
c150: 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a  a = p->pSchema;.
c160: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
c170: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53  e3HashInsert(&pS
c180: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
c190: 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  p->zName, strlen
c1a0: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 70 29 3b  (p->zName)+1,p);
c1b0: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
c1c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c1d0: 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
c1e0: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
c1f0: 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
c200: 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
c210: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
c220: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  led = 1;.      r
c230: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 69 66  eturn;.    }.#if
c240: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c250: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
c260: 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46   for(pFKey=p->pF
c270: 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65  Key; pFKey; pFKe
c280: 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72  y=pFKey->pNextFr
c290: 6f 6d 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  om){.      void 
c2a0: 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 69 6e 74  *data;.      int
c2b0: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
c2c0: 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20  Key->zTo) + 1;. 
c2d0: 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78       pFKey->pNex
c2e0: 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73  tTo = sqlite3Has
c2f0: 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e  hFind(&pSchema->
c300: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
c310: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 64  o, nTo);.      d
c320: 61 74 61 20 3d 20 73 71 6c 69 74 65 33 48 61 73  ata = sqlite3Has
c330: 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61  hInsert(&pSchema
c340: 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e  ->aFKey, pFKey->
c350: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29  zTo, nTo, pFKey)
c360: 3b 0a 20 20 20 20 20 20 69 66 28 20 64 61 74 61  ;.      if( data
c370: 3d 3d 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 20  ==(void *)pFKey 
c380: 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6d  ){.        db->m
c390: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
c3a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
c3b0: 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73 65  endif.    pParse
c3c0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b  ->pNewTable = 0;
c3d0: 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b  .    db->nTable+
c3e0: 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  +;.    db->flags
c3f0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
c400: 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64  nChanges;..#ifnd
c410: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
c420: 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66  LTERTABLE.    if
c430: 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b  ( !p->pSelect ){
c440: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
c450: 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
c460: 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d  t char *)pParse-
c470: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20  >sNameToken.z;. 
c480: 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a       int nName;.
c490: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
c4a0: 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20  Select && pCons 
c4b0: 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20  && pEnd );.     
c4c0: 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30   if( pCons->z==0
c4d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e   ){.        pCon
c4e0: 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  s = pEnd;.      
c4f0: 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20  }.      nName = 
c500: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43  (const char *)pC
c510: 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 3b 0a  ons->z - zName;.
c520: 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f        p->addColO
c530: 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c  ffset = 13 + sql
c540: 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28  ite3Utf8CharLen(
c550: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
c560: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
c570: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
c580: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
c590: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
c5a0: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
c5b0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
c5c0: 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f  te a new VIEW.*/
c5d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
c5e0: 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
c5f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
c600: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
c610: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
c620: 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
c630: 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
c640: 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
c650: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
c660: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
c670: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
c680: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
c690: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
c6a0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
c6b0: 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e2,     /* The t
c6c0: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
c6d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
c6e0: 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74  view */.  Select
c6f0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20   *pSelect,   /* 
c700: 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  A SELECT stateme
c710: 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  nt that will bec
c720: 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77  ome the new view
c730: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
c740: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45  ,        /* TRUE
c750: 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59   for a TEMPORARY
c760: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e   view */.  int n
c770: 6f 45 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a  oErr          /*
c780: 20 53 75 70 70 72 65 73 73 20 65 72 72 6f 72 20   Suppress error 
c790: 6d 65 73 73 61 67 65 73 20 69 66 20 56 49 45 57  messages if VIEW
c7a0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
c7b0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
c7c0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  ;.  int n;.  con
c7d0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
c7e0: 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
c7f0: 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
c800: 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
c810: 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  e;.  int iDb;.  
c820: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
c830: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
c840: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20   pParse->nVar>0 
c850: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
c860: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
c870: 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e  parameters are n
c880: 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69  ot allowed in vi
c890: 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ews");.    sqlit
c8a0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
c8b0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
c8c0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
c8d0: 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61  e3StartTable(pPa
c8e0: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
c8f0: 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20  me2, isTemp, 1, 
c900: 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d  0, noErr);.  p =
c910: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
c920: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
c930: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
c940: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
c950: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
c960: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
c970: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f    }.  sqlite3Two
c980: 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
c990: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
c9a0: 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20   &pName);.  iDb 
c9b0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
c9c0: 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53  oIndex(db, p->pS
c9d0: 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 73 71  chema);.  if( sq
c9e0: 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
c9f0: 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
ca00: 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a   "view", pName).
ca10: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69      && sqlite3Fi
ca20: 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70  xSelect(&sFix, p
ca30: 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20  Select).  ){.   
ca40: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
ca50: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
ca60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
ca70: 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79    /* Make a copy
ca80: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53   of the entire S
ca90: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
caa0: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
cab0: 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73   view..  ** This
cac0: 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20   will force all 
cad0: 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a  the Expr.token.z
cae0: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79   values to be dy
caf0: 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61  namically.  ** a
cb00: 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20  llocated rather 
cb10: 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68  than point to th
cb20: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d  e input string -
cb30: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
cb40: 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c  t.  ** they will
cb50: 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74   persist after t
cb60: 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74  he current sqlit
cb70: 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72  e3_exec() call r
cb80: 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70  eturns..  */.  p
cb90: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
cba0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
cbb0: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c   pSelect);.  sql
cbc0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
cbd0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  (pSelect);.  if(
cbe0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
cbf0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
cc00: 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 2d 3e  .  }.  if( !db->
cc10: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
cc20: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
cc30: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
cc40: 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e, p);.  }..  /*
cc50: 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20   Locate the end 
cc60: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49  of the CREATE VI
cc70: 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d  EW statement.  M
cc80: 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74  ake sEnd point t
cc90: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a  o.  ** the end..
cca0: 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50    */.  sEnd = pP
ccb0: 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
ccc0: 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30  ;.  if( sEnd.z[0
ccd0: 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30  ]!=0 && sEnd.z[0
cce0: 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45  ]!=';' ){.    sE
ccf0: 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a  nd.z += sEnd.n;.
cd00: 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30    }.  sEnd.n = 0
cd10: 3b 0a 20 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d  ;.  n = sEnd.z -
cd20: 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20   pBegin->z;.  z 
cd30: 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
cd40: 64 20 63 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e  d char*)pBegin->
cd50: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  z;.  while( n>0 
cd60: 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20  && (z[n-1]==';' 
cd70: 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31  || isspace(z[n-1
cd80: 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  ])) ){ n--; }.  
cd90: 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
cda0: 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
cdb0: 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65  .  /* Use sqlite
cdc0: 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  3EndTable() to a
cdd0: 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
cde0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
cdf0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
ce00: 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
ce10: 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 29  se, 0, &sEnd, 0)
ce20: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
ce30: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ce40: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66  MIT_VIEW */..#if
ce50: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
ce60: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
ce70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
ce80: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
ce90: 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  )./*.** The Tabl
cea0: 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62  e structure pTab
ceb0: 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56  le is really a V
cec0: 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68  IEW.  Fill in th
ced0: 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  e names of.** th
cee0: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
cef0: 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61   view in the pTa
cf00: 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ble structure.  
cf10: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
cf20: 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20  r.** of errors. 
cf30: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
cf40: 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72  seen leave an er
cf50: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
cf60: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
cf70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69  */.int sqlite3Vi
cf80: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
cf90: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
cfa0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
cfb0: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
cfc0: 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61  ;   /* A fake ta
cfd0: 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77  ble from which w
cfe0: 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74  e get the result
cff0: 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74   set */.  Select
d000: 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43   *pSel;     /* C
d010: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
d020: 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  T that implement
d030: 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  s the view */.  
d040: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20  int nErr = 0;   
d050: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
d060: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
d070: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
d080: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
d090: 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68  orarily holds th
d0a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  e number of curs
d0b0: 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a  ors assigned */.
d0c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d0d0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
d0e0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
d0f0: 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65  ion for malloc e
d100: 72 72 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65  rrors */..  asse
d110: 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23  rt( pTable );..#
d120: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d130: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
d140: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74 61    if( sqlite3Vta
d150: 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61  bCallConnect(pPa
d160: 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a  rse, pTable) ){.
d170: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d180: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
d190: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
d1a0: 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ble) ) return 0;
d1b0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
d1c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
d1d0: 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76  W.  /* A positiv
d1e0: 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65  e nCol means the
d1f0: 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66   columns names f
d200: 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65  or this view are
d210: 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e  .  ** already kn
d220: 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  own..  */.  if( 
d230: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29  pTable->nCol>0 )
d240: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
d250: 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   A negative nCol
d260: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61   is a special ma
d270: 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61  rker meaning tha
d280: 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  t we are current
d290: 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  ly.  ** trying t
d2a0: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
d2b0: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20  lumn names.  If 
d2c0: 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f  we enter this ro
d2d0: 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  utine with.  ** 
d2e0: 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c  a negative nCol,
d2f0: 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72   it means two or
d300: 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d   more views form
d310: 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68   a loop, like th
d320: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
d330: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e    CREATE VIEW on
d340: 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  e AS SELECT * FR
d350: 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20  OM two;.  **    
d360: 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f   CREATE VIEW two
d370: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
d380: 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  M one;.  **.  **
d390: 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20   Actually, this 
d3a0: 65 72 72 6f 72 20 69 73 20 63 61 75 67 68 74 20  error is caught 
d3b0: 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73  previously and s
d3c0: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
d3d0: 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  test.  ** should
d3e0: 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42   always fail.  B
d3f0: 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65  ut we will leave
d400: 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73   it in place jus
d410: 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20  t to be safe..  
d420: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
d430: 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73  >nCol<0 ){.    s
d440: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d450: 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20  Parse, "view %s 
d460: 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65  is circularly de
d470: 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e  fined", pTable->
d480: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
d490: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 1;.  }.  asse
d4a0: 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  rt( pTable->nCol
d4b0: 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  >=0 );..  /* If 
d4c0: 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
d4d0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65   it means we nee
d4e0: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
d4f0: 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20   table names..  
d500: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
d510: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
d520: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
d530: 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  t() will expand 
d540: 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65  any.  ** "*" ele
d550: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73  ments in the res
d560: 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20  ults set of the 
d570: 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73  view and will as
d580: 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a  sign cursors.  *
d590: 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74  * to the element
d5a0: 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  s of the FROM cl
d5b0: 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f  ause.  But we do
d5c0: 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20   not want these 
d5d0: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20  changes.  ** to 
d5e0: 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53  be permanent.  S
d5f0: 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  o the computatio
d600: 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63  n is done on a c
d610: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
d620: 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  T.  ** statement
d630: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
d640: 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61  e view..  */.  a
d650: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70  ssert( pTable->p
d660: 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c  Select );.  pSel
d670: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
d680: 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  Dup(db, pTable->
d690: 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20  pSelect);.  if( 
d6a0: 70 53 65 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20  pSel ){.    n = 
d6b0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
d6c0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
d6d0: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
d6e0: 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63  arse, pSel->pSrc
d6f0: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  );.    pTable->n
d700: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 70 53  Col = -1;.    pS
d710: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
d720: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
d730: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c  (pParse, 0, pSel
d740: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
d750: 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28  Tab = n;.    if(
d760: 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
d770: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
d780: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
d790: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
d7a0: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
d7b0: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61  .      pTable->a
d7c0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
d7d0: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  Col;.      pSelT
d7e0: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
d7f0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
d800: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  l = 0;.      sql
d810: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
d820: 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20  pSelTab);.      
d830: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
d840: 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72  >flags |= DB_Unr
d850: 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20 20 7d  esetViews;.    }
d860: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
d870: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
d880: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
d890: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  }.    sqlite3Sel
d8a0: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 29 3b  ectDelete(pSel);
d8b0: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
d8c0: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64  nErr++;.  }.#end
d8d0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
d8e0: 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75  T_VIEW */.  retu
d8f0: 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e  rn nErr;  .}.#en
d900: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
d910: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
d920: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
d930: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
d940: 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e  LTABLE) */..#ifn
d950: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d960: 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  VIEW./*.** Clear
d970: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
d980: 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45  s from every VIE
d990: 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64  W in database id
d9a0: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
d9b0: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
d9c0: 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  tAll(sqlite3 *db
d9d0: 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61  , int idx){.  Ha
d9e0: 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28  shElem *i;.  if(
d9f0: 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
da00: 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
da10: 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75  setViews) ) retu
da20: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  rn;.  for(i=sqli
da30: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
da40: 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d  >aDb[idx].pSchem
da50: 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69  a->tblHash); i;i
da60: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
da70: 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
da80: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
da90: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
daa0: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
dab0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52  ){.      sqliteR
dac0: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
dad0: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTab);.    }.  }
dae0: 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72  .  DbClearProper
daf0: 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
db00: 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a  nresetViews);.}.
db10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
db20: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
db30: 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a  l(A,B).#endif /*
db40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
db50: 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  W */../*.** This
db60: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
db70: 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20  led by the VDBE 
db80: 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e  to adjust the in
db90: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
dba0: 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20   used by SQLite 
dbb0: 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c  when the btree l
dbc0: 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62  ayer moves a tab
dbd0: 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68  le root page. Th
dbe0: 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f  e.** root-page o
dbf0: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
dc00: 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  ex in database i
dc10: 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66  Db has changed f
dc20: 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20  rom iFrom.** to 
dc30: 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65  iTo..**.** Ticke
dc40: 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79  t #1728:  The sy
dc50: 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  mbol table might
dc60: 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69   still contain i
dc70: 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e  nformation.** on
dc80: 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69   tables and/or i
dc90: 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20  ndices that are 
dca0: 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62  the process of b
dcb0: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
dcc0: 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75   If you are unlu
dcd0: 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73  cky, one of thos
dce0: 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
dcf0: 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68  s or tables migh
dd00: 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61  t.** have the sa
dd10: 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62  me rootpage numb
dd20: 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74  er as the real t
dd30: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68  able or index th
dd40: 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d  at is.** being m
dd50: 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  oved.  So we can
dd60: 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69  not stop searchi
dd70: 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72  ng after the fir
dd80: 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63  st match .** bec
dd90: 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d  ause the first m
dda0: 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f  atch might be fo
ddb0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c  r one of the del
ddc0: 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20  eted indices.** 
ddd0: 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f  or tables and no
dde0: 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  t the table/inde
ddf0: 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c  x that is actual
de00: 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a  ly being moved..
de10: 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69  ** We must conti
de20: 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69  nue looping unti
de30: 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64  l all tables and
de40: 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a   indices with.**
de50: 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d   rootpage==iFrom
de60: 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65   have been conve
de70: 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72  rted to have a r
de80: 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a  ootpage of iTo.*
de90: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  * in order to be
dea0: 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65   certain that we
deb0: 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   got the right o
dec0: 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ne..*/.#ifndef S
ded0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
dee0: 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74  ACUUM.void sqlit
def0: 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28  e3RootPageMoved(
df00: 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46 72  Db *pDb, int iFr
df10: 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20  om, int iTo){.  
df20: 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
df30: 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a  .  Hash *pHash;.
df40: 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
df50: 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
df60: 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
df70: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
df80: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
df90: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
dfa0: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
dfb0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
dfc0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
dfd0: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  em);.    if( pTa
dfe0: 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  b->tnum==iFrom )
dff0: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e  {.      pTab->tn
e000: 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a  um = iTo;.    }.
e010: 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70    }.  pHash = &p
e020: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db->pSchema->idx
e030: 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65  Hash;.  for(pEle
e040: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
e050: 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  t(pHash); pElem;
e060: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
e070: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
e080: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
e090: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
e0a0: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
e0b0: 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pIdx->tnum==iFro
e0c0: 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  m ){.      pIdx-
e0d0: 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
e0e0: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
e0f0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64  ./*.** Write cod
e100: 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74  e to erase the t
e110: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
e120: 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20  age iTable from 
e130: 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a  database iDb..**
e140: 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65   Also write code
e150: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73   to modify the s
e160: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
e170: 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  le and internal 
e180: 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72  schema.** if a r
e190: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74  oot-page of anot
e1a0: 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
e1b0: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d  ed by the btree-
e1c0: 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20  layer whilst.** 
e1d0: 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28  erasing iTable (
e1e0: 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
e1f0: 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
e200: 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
e210: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  / .static void d
e220: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50  estroyRootPage(P
e230: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
e240: 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44  t iTable, int iD
e250: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
e260: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
e270: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
e280: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e290: 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65  _Destroy, iTable
e2a0: 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20  , iDb);.#ifndef 
e2b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
e2c0: 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44  VACUUM.  /* OP_D
e2d0: 65 73 74 72 6f 79 20 70 75 73 68 65 73 20 61 6e  estroy pushes an
e2e0: 20 69 6e 74 65 67 65 72 20 6f 6e 74 6f 20 74 68   integer onto th
e2f0: 65 20 73 74 61 63 6b 2e 20 49 66 20 74 68 69 73  e stack. If this
e300: 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73   integer.  ** is
e310: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
e320: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
e330: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
e340: 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20  table moved to. 
e350: 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61   ** location iTa
e360: 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ble. The followi
e370: 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73  ng code modifies
e380: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
e390: 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a  er table to.  **
e3a0: 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20   reflect this.. 
e3b0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 30   **.  ** The "#0
e3c0: 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20  " in the SQL is 
e3d0: 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61  a special consta
e3e0: 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68  nt that means wh
e3f0: 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a  atever value.  *
e400: 2a 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20  * is on the top 
e410: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53  of the stack.  S
e420: 65 65 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  ee sqlite3Regist
e430: 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20  erExpr()..  */. 
e440: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
e450: 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
e460: 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
e470: 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20  SET rootpage=%d 
e480: 57 48 45 52 45 20 23 30 20 41 4e 44 20 72 6f 6f  WHERE #0 AND roo
e490: 74 70 61 67 65 3d 23 30 22 2c 0a 20 20 20 20 20  tpage=#0",.     
e4a0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
e4b0: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
e4c0: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69  MA_TABLE(iDb), i
e4d0: 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 7d  Table);.#endif.}
e4e0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44  ../*.** Write VD
e4f0: 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  BE code to erase
e500: 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
e510: 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69  all associated i
e520: 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a  ndices on disk..
e530: 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74  ** Code to updat
e540: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
e550: 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69  ter tables and i
e560: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
e570: 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e  efinitions.** in
e580: 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67   case a root-pag
e590: 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
e5a0: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
e5b0: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
e5c0: 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61  ee layer.** is a
e5d0: 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20  lso added (this 
e5e0: 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
e5f0: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
e600: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
e610: 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
e620: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
e630: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
e640: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
e650: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
e660: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
e670: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
e680: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
e690: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
e6a0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64  b->pSchema);.  d
e6b0: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
e6c0: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75  Parse, pTab->tnu
e6d0: 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70  m, iDb);.  for(p
e6e0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
e6f0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
e700: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64  x->pNext){.    d
e710: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
e720: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75  Parse, pIdx->tnu
e730: 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c  m, iDb);.  }.#el
e740: 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  se.  /* If the d
e750: 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61  atabase may be a
e760: 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62  uto-vacuum capab
e770: 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d  le (if SQLITE_OM
e780: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
e790: 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ** is not define
e7a0: 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69  d), then it is i
e7b0: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c  mportant to call
e7c0: 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74   OP_Destroy on t
e7d0: 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e  he.  ** table an
e7e0: 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67  d index root-pag
e7f0: 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61  es in order, sta
e800: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e  rting with the n
e810: 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a  umerically .  **
e820: 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
e830: 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20  ge number. This 
e840: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
e850: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74  none of the root
e860: 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  -pages.  ** to b
e870: 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72  e destroyed is r
e880: 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65  elocated by an e
e890: 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f  arlier OP_Destro
e8a0: 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20  y. i.e. if the. 
e8b0: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65   ** following we
e8c0: 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20  re coded:.  **. 
e8d0: 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34   ** OP_Destroy 4
e8e0: 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a   0.  ** ....  **
e8f0: 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a   OP_Destroy 5 0.
e900: 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f    **.  ** and ro
e910: 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e  ot page 5 happen
e920: 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72  ed to be the lar
e930: 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
e940: 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a  umber in the.  *
e950: 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  * database, then
e960: 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75   root page 5 wou
e970: 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70  ld be moved to p
e980: 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20  age 4 by the .  
e990: 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34  ** "OP_Destroy 4
e9a0: 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20   0" opcode. The 
e9b0: 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44  subsequent "OP_D
e9c0: 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c  estroy 5 0" woul
e9d0: 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65  d hit.  ** a fre
e9e0: 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a  e-list page..  *
e9f0: 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
ea00: 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74  Tab->tnum;.  int
ea10: 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b   iDestroyed = 0;
ea20: 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
ea30: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
ea40: 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73  .    int iLarges
ea50: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
ea60: 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
ea70: 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64   iTab<iDestroyed
ea80: 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65   ){.      iLarge
ea90: 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d  st = iTab;.    }
eaa0: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
eab0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
eac0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
ead0: 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
eae0: 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d  Idx = pIdx->tnum
eaf0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
eb00: 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  pIdx->pSchema==p
eb10: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
eb20: 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74        if( (iDest
eb30: 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64  royed==0 || (iId
eb40: 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26  x<iDestroyed)) &
eb50: 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20  & iIdx>iLargest 
eb60: 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67  ){.        iLarg
eb70: 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20  est = iIdx;.    
eb80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
eb90: 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b  ( iLargest==0 ){
eba0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
ebb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ebc0: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
ebd0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
ebe0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
ebf0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
ec00: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
ec10: 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73  (pParse, iLarges
ec20: 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69  t, iDb);.      i
ec30: 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
ec40: 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gest;.    }.  }.
ec50: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
ec60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
ec70: 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65  called to do the
ec80: 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20   work of a DROP 
ec90: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
eca0: 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65  .** pName is the
ecb0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
ecc0: 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64  le to be dropped
ecd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ece0: 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  3DropTable(Parse
ecf0: 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
ed00: 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73  t *pName, int is
ed10: 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29  View, int noErr)
ed20: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
ed30: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
ed40: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
ed50: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
ed60: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
ed70: 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
ed80: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
ed90: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
eda0: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73  _table;.  }.  as
edb0: 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
edc0: 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d  c==1 );.  pTab =
edd0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
ede0: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
edf0: 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
ee00: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
ee10: 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54  base);..  if( pT
ee20: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ab==0 ){.    if(
ee30: 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20   noErr ){.      
ee40: 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65 61  sqlite3ErrorClea
ee50: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  r(pParse);.    }
ee60: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
ee70: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
ee80: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
ee90: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
eea0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
eeb0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
eec0: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
eed0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62  );..  /* If pTab
eee0: 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61   is a virtual ta
eef0: 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47 65  ble, call ViewGe
ef00: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74  tColumnNames() t
ef10: 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74  o ensure.  ** it
ef20: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
ef30: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  .  */.  if( IsVi
ef40: 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20 73  rtual(pTab) && s
ef50: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
ef60: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
ef70: 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f   pTab) ){.    go
ef80: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
ef90: 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  le;.  }.#ifndef 
efa0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
efb0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
efc0: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
efd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
efe0: 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
eff0: 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  iDb);.    const 
f000: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
f010: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
f020: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f030: 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69  zArg2 = 0;.    i
f040: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
f050: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
f060: 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
f070: 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20   0, zDb)){.     
f080: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
f090: 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
f0a0: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
f0b0: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
f0c0: 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
f0d0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
f0e0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
f0f0: 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
f100: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
f110: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
f120: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23  _VIEW;.      }.#
f130: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f140: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
f150: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
f160: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
f170: 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51  .      code = SQ
f180: 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45  LITE_DROP_VTABLE
f190: 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20  ;.      zArg2 = 
f1a0: 70 54 61 62 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d  pTab->pMod->zNam
f1b0: 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  e;.#endif.    }e
f1c0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
f1d0: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
f1e0: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
f1f0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
f200: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ROP_TEMP_TABLE;.
f210: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f220: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
f230: 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20  TE_DROP_TABLE;. 
f240: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f250: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
f260: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
f270: 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  de, pTab->zName,
f280: 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a   zArg2, zDb) ){.
f290: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
f2a0: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
f2b0: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
f2c0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
f2d0: 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
f2e0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
f2f0: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
f300: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
f310: 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  able;.    }.  }.
f320: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61  #endif.  if( pTa
f330: 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 70  b->readOnly || p
f340: 54 61 62 3d 3d 64 62 2d 3e 61 44 62 5b 69 44 62  Tab==db->aDb[iDb
f350: 5d 2e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54  ].pSchema->pSeqT
f360: 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
f370: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f380: 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
f390: 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
f3a0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
f3b0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
f3c0: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  p_table;.  }..#i
f3d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f3e0: 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75  T_VIEW.  /* Ensu
f3f0: 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73  re DROP TABLE is
f400: 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76   not used on a v
f410: 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49  iew, and DROP VI
f420: 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  EW is not used. 
f430: 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a   ** on a table..
f440: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
f450: 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
f460: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
f470: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f480: 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
f490: 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
f4a0: 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
f4b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
f4c0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
f4d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
f4e0: 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
f4f0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
f500: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
f510: 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
f520: 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
f530: 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
f540: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
f550: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
f560: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
f570: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
f580: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
f590: 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
f5a0: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
f5b0: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
f5c0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
f5d0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
f5e0: 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20   ){.    Trigger 
f5f0: 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 44  *pTrigger;.    D
f600: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
f610: 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69  b[iDb];.    sqli
f620: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
f630: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
f640: 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
f650: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
f660: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
f670: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
f680: 29 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65 20  ) ){.      Vdbe 
f690: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
f6a0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
f6b0: 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20     if( v ){.    
f6c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f6d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 56 42 65 67 69  ddOp(v, OP_VBegi
f6e0: 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
f6f0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
f700: 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20      /* Drop all 
f710: 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
f720: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
f730: 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
f740: 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73  . Code.    ** is
f750: 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65   generated to re
f760: 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f  move entries fro
f770: 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  m sqlite_master 
f780: 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71  and/or.    ** sq
f790: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
f7a0: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20   if required..  
f7b0: 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65    */.    pTrigge
f7c0: 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67  r = pTab->pTrigg
f7d0: 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  er;.    while( p
f7e0: 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20  Trigger ){.     
f7f0: 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
f800: 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  r->pSchema==pTab
f810: 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20  ->pSchema || .  
f820: 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72          pTrigger
f830: 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
f840: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b  Db[1].pSchema );
f850: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 72  .      sqlite3Dr
f860: 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
f870: 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a  rse, pTrigger);.
f880: 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d        pTrigger =
f890: 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74   pTrigger->pNext
f8a0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
f8b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f8c0: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f  OINCREMENT.    /
f8d0: 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74  * Remove any ent
f8e0: 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ries of the sqli
f8f0: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
f900: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
f910: 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62  h.    ** the tab
f920: 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
f930: 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62  . This is done b
f940: 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20  efore the table 
f950: 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20 2a  is dropped.    *
f960: 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c  * at the btree l
f970: 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68  evel, in case th
f980: 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
f990: 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f  e table needs to
f9a0: 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20  .    ** move as 
f9b0: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
f9c0: 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e  drop (can happen
f9d0: 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
f9e0: 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  mode)..    */.  
f9f0: 20 20 69 66 28 20 70 54 61 62 2d 3e 61 75 74 6f    if( pTab->auto
fa00: 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Inc ){.      sql
fa10: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
fa20: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
fa30: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e  "DELETE FROM %s.
fa40: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
fa50: 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
fa60: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
fa70: 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a  me, pTab->zName.
fa80: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23        );.    }.#
fa90: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72  endif..    /* Dr
faa0: 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
fab0: 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69  STER table and i
fac0: 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61  ndex entries tha
fad0: 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20  t refer to the. 
fae0: 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65     ** table. The
faf0: 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f   program name lo
fb00: 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ops through the 
fb10: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
fb20: 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20   deletes.    ** 
fb30: 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72  every row that r
fb40: 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
fb50: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
fb60: 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69  e as the one bei
fb70: 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65  ng.    ** droppe
fb80: 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20  d. Triggers are 
fb90: 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65  handled seperate
fba0: 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69  ly because a tri
fbb0: 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20  gger can be.    
fbc0: 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ** created in th
fbd0: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
fbe0: 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
fbf0: 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65   table in anothe
fc00: 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  r.    ** databas
fc10: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
fc20: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
fc30: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
fc40: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
fc50: 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e  Q.%s WHERE tbl_n
fc60: 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21  ame=%Q and type!
fc70: 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20  ='trigger'",.   
fc80: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c       pDb->zName,
fc90: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
fca0: 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  b), pTab->zName)
fcb0: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  ;.    if( !isVie
fcc0: 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  w && !IsVirtual(
fcd0: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 64  pTab) ){.      d
fce0: 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72  estroyTable(pPar
fcf0: 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d  se, pTab);.    }
fd00: 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
fd10: 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
fd20: 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e  from SQLite's in
fd30: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e  ternal schema an
fd40: 64 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20  d modify.    ** 
fd50: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
fd60: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
fd70: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
fd80: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
fd90: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
fda0: 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30  VDestroy, iDb, 0
fdb0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
fdc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
fdd0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
fde0: 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62  P_DropTable, iDb
fdf0: 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
fe00: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
fe10: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
fe20: 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20  , v, iDb);.  }. 
fe30: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
fe40: 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65  All(db, iDb);..e
fe50: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a  xit_drop_table:.
fe60: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
fe70: 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d  Delete(pName);.}
fe80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
fe90: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
fea0: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66  o create a new f
feb0: 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68  oreign key on th
fec0: 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65  e table.** curre
fed0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
fee0: 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43  ruction.  pFromC
fef0: 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ol determines wh
ff00: 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69  ich columns.** i
ff10: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
ff20: 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ble point to the
ff30: 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49   foreign key.  I
ff40: 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68  f pFromCol==0 th
ff50: 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68  en.** connect th
ff60: 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73  e key to the las
ff70: 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65  t column inserte
ff80: 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e  d.  pTo is the n
ff90: 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  ame of.** the ta
ffa0: 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e  ble referred to.
ffb0: 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69    pToCol is a li
ffc0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
ffd0: 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f  the other.** pTo
ffe0: 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20   table that the 
fff0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e  foreign key poin
10000 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f  ts to.  flags co
10010 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e  ntains all.** in
10020 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
10030 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  the conflict res
10040 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
10050 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  ms specified.** 
10060 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45  in the ON DELETE
10070 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20  , ON UPDATE and 
10080 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65  ON INSERT clause
10090 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79  s..**.** An FKey
100a0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
100b0 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20  eated and added 
100c0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
100d0 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20  rently.** under 
100e0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20  construction in 
100f0 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  the pParse->pNew
10100 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68  Table field.  Th
10110 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73  e new FKey.** is
10120 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f   not linked into
10130 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68   db->aFKey at th
10140 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20  is point - that 
10150 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a  does not happen.
10160 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33  ** until sqlite3
10170 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a  EndTable()..**.*
10180 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  * The foreign ke
10190 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d  y is set for IMM
101a0 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e  EDIATE processin
101b0 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74  g.  A subsequent
101c0 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69   call.** to sqli
101d0 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
101e0 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67  ey() might chang
101f0 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52  e this to DEFERR
10200 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ED..*/.void sqli
10210 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e  te3CreateForeign
10220 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
10230 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
10240 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
10250 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46  /.  ExprList *pF
10260 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75  romCol,  /* Colu
10270 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c  mns in this tabl
10280 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  e that point to 
10290 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
102a0 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20   Token *pTo,    
102b0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
102c0 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
102d0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
102e0 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f  pToCol,    /* Co
102f0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68  lumns in the oth
10300 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  er table */.  in
10310 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
10320 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72     /* Conflict r
10330 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
10340 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e  thms. */.){.#ifn
10350 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10360 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b  FOREIGN_KEY.  FK
10370 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20  ey *pFKey = 0;. 
10380 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72   Table *p = pPar
10390 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
103a0 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
103b0 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t i;.  int nCol;
103c0 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61  .  char *z;..  a
103d0 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b  ssert( pTo!=0 );
103e0 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
103f0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 49  Parse->nErr || I
10400 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
10410 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
10420 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
10430 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  ){.    int iCol 
10440 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20  = p->nCol-1;.   
10450 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f   if( iCol<0 ) go
10460 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69  to fk_end;.    i
10470 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
10480 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  Col->nExpr!=1 ){
10490 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
104a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
104b0 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25  foreign key on %
104c0 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68  s".         " sh
104d0 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f  ould reference o
104e0 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f  nly one column o
104f0 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20  f table %T",.   
10500 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43        p->aCol[iC
10510 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b  ol].zName, pTo);
10520 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  .      goto fk_e
10530 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  nd;.    }.    nC
10540 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ol = 1;.  }else 
10550 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
10560 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72  oCol->nExpr!=pFr
10570 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a  omCol->nExpr ){.
10580 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10590 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
105a0 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63      "number of c
105b0 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
105c0 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
105d0 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
105e0 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f  of ".        "co
105f0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66  lumns in the ref
10600 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b  erenced table");
10610 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
10620 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
10630 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Col = pFromCol->
10640 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79  nExpr;.  }.  nBy
10650 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b  te = sizeof(*pFK
10660 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f  ey) + nCol*sizeo
10670 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d  f(pFKey->aCol[0]
10680 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a  ) + pTo->n + 1;.
10690 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
106a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
106b0 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b  ToCol->nExpr; i+
106c0 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20  +){.      nByte 
106d0 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c  += strlen(pToCol
106e0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20  ->a[i].zName) + 
106f0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
10700 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62  FKey = sqlite3Db
10710 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
10720 65 2d 3e 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  e->db, nByte );.
10730 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29    if( pFKey==0 )
10740 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  {.    goto fk_en
10750 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e  d;.  }.  pFKey->
10760 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b  pFrom = p;.  pFK
10770 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20  ey->pNextFrom = 
10780 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20  p->pFKey;.  z = 
10790 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d  (char*)&pFKey[1]
107a0 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20  ;.  pFKey->aCol 
107b0 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61  = (struct sColMa
107c0 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a  p*)z;.  z += siz
107d0 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d  eof(struct sColM
107e0 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65  ap)*nCol;.  pFKe
107f0 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65  y->zTo = z;.  me
10800 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20  mcpy(z, pTo->z, 
10810 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f  pTo->n);.  z[pTo
10820 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d  ->n] = 0;.  z +=
10830 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b   pTo->n+1;.  pFK
10840 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b  ey->pNextTo = 0;
10850 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d  .  pFKey->nCol =
10860 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72   nCol;.  if( pFr
10870 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
10880 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69  pFKey->aCol[0].i
10890 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  From = p->nCol-1
108a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
108b0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
108c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
108d0 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
108e0 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ; j<p->nCol; j++
108f0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
10900 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d  qlite3StrICmp(p-
10910 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
10920 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
10930 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
10940 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
10950 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a  l[i].iFrom = j;.
10960 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
10970 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10980 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
10990 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  p->nCol ){.     
109a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
109b0 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
109c0 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63        "unknown c
109d0 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20  olumn \"%s\" in 
109e0 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
109f0 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20  nition", .      
10a00 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b      pFromCol->a[
10a10 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
10a20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
10a30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10a40 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  }.  if( pToCol )
10a50 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
10a60 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
10a70 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
10a80 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  n(pToCol->a[i].z
10a90 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b  Name);.      pFK
10aa0 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c  ey->aCol[i].zCol
10ab0 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63   = z;.      memc
10ac0 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b  py(z, pToCol->a[
10ad0 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  i].zName, n);.  
10ae0 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20      z[n] = 0;.  
10af0 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20      z += n+1;.  
10b00 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d    }.  }.  pFKey-
10b10 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b  >isDeferred = 0;
10b20 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65  .  pFKey->delete
10b30 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30  Conf = flags & 0
10b40 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70  xff;.  pFKey->up
10b50 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67  dateConf = (flag
10b60 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b  s >> 8 ) & 0xff;
10b70 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74  .  pFKey->insert
10b80 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e  Conf = (flags >>
10b90 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20   16 ) & 0xff;.. 
10ba0 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72   /* Link the for
10bb0 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20  eign key to the 
10bc0 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73  table as the las
10bd0 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70  t step..  */.  p
10be0 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b  ->pFKey = pFKey;
10bf0 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66  .  pFKey = 0;..f
10c00 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33  k_end:.  sqlite3
10c10 5f 66 72 65 65 28 70 46 4b 65 79 29 3b 0a 23 65  _free(pFKey);.#e
10c20 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
10c30 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
10c40 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73  EIGN_KEY) */.  s
10c50 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
10c60 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a  lete(pFromCol);.
10c70 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
10c80 74 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b  tDelete(pToCol);
10c90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
10ca0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
10cb0 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
10cc0 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
10cd0 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
10ce0 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
10cf0 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
10d00 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
10d10 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
10d20 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
10d30 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
10d40 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
10d50 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
10d60 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
10d70 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
10d80 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
10d90 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
10da0 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
10db0 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
10dc0 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
10dd0 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
10de0 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
10df0 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
10e00 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  red){.#ifndef SQ
10e10 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
10e20 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70  N_KEY.  Table *p
10e30 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
10e40 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
10e50 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
10e60 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
10e70 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
10e80 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10e90 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
10ea0 64 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a  d = isDeferred;.
10eb0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
10ec0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
10ed0 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e  at will erase an
10ee0 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a  d refill index *
10ef0 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a  pIdx.  This is.*
10f00 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61  * used to initia
10f10 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65  lize a newly cre
10f20 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f  ated index or to
10f30 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a   recompute the.*
10f40 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  * content of an 
10f50 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73  index in respons
10f60 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63  e to a REINDEX c
10f70 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66  ommand..**.** if
10f80 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
10f90 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74  not negative, it
10fa0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
10fb0 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a  index is newly.*
10fc0 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  * created.  The 
10fd0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 73 70 65 63  memory cell spec
10fe0 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74  ified by memRoot
10ff0 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Page contains th
11000 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e  e.** root page n
11010 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
11020 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50  ex.  If memRootP
11030 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
11040 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64   then.** the ind
11050 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
11060 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c  s and must be cl
11070 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69  eared before bei
11080 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a  ng refilled and.
11090 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
110a0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
110b0 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72  ndex is taken fr
110c0 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e  om pIndex->tnum.
110d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
110e0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
110f0 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
11100 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c  , Index *pIndex,
11110 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65   int memRootPage
11120 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
11130 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
11140 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  e;  /* The table
11150 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64   that is indexed
11160 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
11170 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20   pParse->nTab;  
11180 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
11190 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54  rsor used for pT
111a0 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ab */.  int iIdx
111b0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
111c0 31 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  1;     /* Btree 
111d0 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
111e0 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20  pIndex */.  int 
111f0 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
11200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
11210 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20  dress of top of 
11220 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e  loop */.  int tn
11230 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
11240 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
11250 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a   page of index *
11260 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11280 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
11290 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69  ode into this vi
112a0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f  rtual machine */
112b0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
112c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
112d0 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72    /* KeyInfo for
112e0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69   index */.  sqli
112f0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
11300 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68  ->db;      /* Th
11310 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
11320 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
11330 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
11340 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
11350 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
11360 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11370 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
11380 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
11390 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
113a0 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  , SQLITE_REINDEX
113b0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
113c0 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   0,.      db->aD
113d0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29  b[iDb].zName ) )
113e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
113f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
11400 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  equire a write-l
11410 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
11420 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73   to perform this
11430 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
11440 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
11450 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
11460 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61  ab->tnum, 1, pTa
11470 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20  b->zName);..  v 
11480 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
11490 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
114a0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
114b0 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
114c0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
114d0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
114e0 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f  P_MemLoad, memRo
114f0 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  otPage, 0);.    
11500 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tnum = 0;.  }els
11510 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49  e{.    tnum = pI
11520 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  ndex->tnum;.    
11530 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11540 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e  (v, OP_Clear, tn
11550 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20  um, iDb);.  }.  
11560 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11570 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
11580 69 44 62 2c 20 30 29 3b 0a 20 20 70 4b 65 79 20  iDb, 0);.  pKey 
11590 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
115a0 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
115b0 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  ndex);.  sqlite3
115c0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
115d0 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74  enWrite, iIdx, t
115e0 6e 75 6d 2c 20 28 63 68 61 72 20 2a 29 70 4b 65  num, (char *)pKe
115f0 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P3_KEYINFO_HA
11600 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65  NDOFF);.  sqlite
11610 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
11620 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
11630 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
11640 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
11650 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11660 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
11670 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65   0);.  sqlite3Ge
11680 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 76  nerateIndexKey(v
11690 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62 29 3b  , pIndex, iTab);
116a0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f  .  if( pIndex->o
116b0 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
116c0 29 7b 0a 20 20 20 20 69 6e 74 20 63 75 72 61 64  ){.    int curad
116d0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
116e0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
116f0 20 20 20 20 69 6e 74 20 61 64 64 72 32 20 3d 20      int addr2 = 
11700 63 75 72 61 64 64 72 2b 34 3b 0a 20 20 20 20 73  curaddr+4;.    s
11710 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
11720 50 32 28 76 2c 20 63 75 72 61 64 64 72 2d 31 2c  P2(v, curaddr-1,
11730 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73 71 6c   addr2);.    sql
11740 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11750 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c   OP_Rowid, iTab,
11760 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11770 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11780 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29 3b 0a 20  AddImm, 1, 0);. 
11790 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
117a0 64 4f 70 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71  dOp(v, OP_IsUniq
117b0 75 65 2c 20 69 49 64 78 2c 20 61 64 64 72 32 29  ue, iIdx, addr2)
117c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
117d0 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  eOp3(v, OP_Halt,
117e0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
117f0 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c 0a 20 20  NT, OE_Abort,.  
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11810 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d    "indexed colum
11820 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75  ns are not uniqu
11830 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  e", P3_STATIC);.
11840 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
11850 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
11860 61 64 64 72 32 3d 3d 73 71 6c 69 74 65 33 56 64  addr2==sqlite3Vd
11870 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
11880 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
11890 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
118a0 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78  _IdxInsert, iIdx
118b0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
118c0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
118d0 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31  ext, iTab, addr1
118e0 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
118f0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
11900 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  dr1);.  sqlite3V
11910 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
11920 6c 6f 73 65 2c 20 69 54 61 62 2c 20 30 29 3b 0a  lose, iTab, 0);.
11930 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11940 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
11950 69 49 64 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  iIdx, 0);.}../*.
11960 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
11970 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c  index for an SQL
11980 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e   table.  pName1.
11990 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61  pName2 is the na
119a0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
119b0 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74  .** and pTblList
119c0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
119d0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
119e0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
119f0 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20    Both will .** 
11a00 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72  be NULL for a pr
11a10 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20  imary key or an 
11a20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72  index that is cr
11a30 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79  eated to satisfy
11a40 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e   a.** UNIQUE con
11a50 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61  straint.  If pTa
11a60 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61  ble and pIndex a
11a70 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61  re NULL, use pPa
11a80 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a  rse->pNewTable.*
11a90 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  * as the table t
11aa0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
11ab0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
11ac0 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74   is a table that
11ad0 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79   is.** currently
11ae0 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
11af0 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54  ed by a CREATE T
11b00 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
11b10 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61  **.** pList is a
11b20 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
11b30 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
11b40 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e   pList will be N
11b50 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ULL if this.** i
11b60 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  s a primary key 
11b70 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72  or unique-constr
11b80 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  aint on the most
11b90 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61   recent column a
11ba0 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74  dded.** to the t
11bb0 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
11bc0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
11bd0 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  n.  .*/.void sql
11be0 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
11bf0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11c00 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66  ,     /* All inf
11c10 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
11c20 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54  his parse */.  T
11c30 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
11c40 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20    /* First part 
11c50 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
11c60 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
11c70 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
11c80 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
11c90 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
11ca0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
11cb0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e    SrcList *pTblN
11cc0 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f  ame, /* Table to
11cd0 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72   index. Use pPar
11ce0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66  se->pNewTable if
11cf0 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74   0 */.  ExprList
11d00 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20   *pList,   /* A 
11d10 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
11d20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
11d30 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
11d40 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72        /* OE_Abor
11d50 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45  t, OE_Ignore, OE
11d60 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f  _Replace, or OE_
11d70 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  None */.  Token 
11d80 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20  *pStart,     /* 
11d90 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
11da0 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 69   that begins thi
11db0 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  s statement */. 
11dc0 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20   Token *pEnd,   
11dd0 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74      /* The ")" t
11de0 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43  hat closes the C
11df0 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
11e00 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73  ement */.  int s
11e10 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a  ortOrder,     /*
11e20 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70   Sort order of p
11e30 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20  rimary key when 
11e40 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20  pList==NULL */. 
11e50 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20   int ifNotExist 
11e60 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f      /* Omit erro
11e70 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61  r if index alrea
11e80 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
11e90 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
11ea0 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  0;     /* Table 
11eb0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
11ec0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
11ed0 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69   = 0;   /* The i
11ee0 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74  ndex to be creat
11ef0 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
11f00 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
11f10 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  Name of the inde
11f20 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  x */.  int nName
11f30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
11f40 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
11f50 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a  ers in zName */.
11f60 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f    int i, j;.  To
11f70 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20  ken nullId;     
11f80 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e     /* Fake token
11f90 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44   for an empty ID
11fa0 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78   list */.  DbFix
11fb0 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20 20  er sFix;        
11fc0 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67  /* For assigning
11fd0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20   database names 
11fe0 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69  to pTable */.  i
11ff0 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b  nt sortOrderMask
12000 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f  ;   /* 1 to hono
12010 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e  r DESC in index.
12020 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a    0 to ignore. *
12030 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
12040 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
12050 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
12060 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63       /* The spec
12070 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61  ific table conta
12080 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65  ining the indexe
12090 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  d database */.  
120a0 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
120b0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
120c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
120d0 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  at is being writ
120e0 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ten */.  Token *
120f0 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a  pName = 0;    /*
12100 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
12110 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  e of the index t
12120 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74  o create */.  st
12130 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
12140 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f  em *pListItem; /
12150 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
12160 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  er pList */.  in
12170 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45  t nCol;.  int nE
12180 78 74 72 61 20 3d 20 30 3b 0a 20 20 63 68 61 72  xtra = 0;.  char
12190 20 2a 7a 45 78 74 72 61 3b 0a 0a 20 20 69 66 28   *zExtra;..  if(
121a0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
121b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
121c0 64 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f  d || IN_DECLARE_
121d0 56 54 41 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f  VTAB ){.    goto
121e0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
121f0 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ex;.  }..  /*.  
12200 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c  ** Find the tabl
12210 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
12220 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e  indexed.  Return
12230 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f   early if not fo
12240 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  und..  */.  if( 
12250 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a  pTblName!=0 ){..
12260 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74      /* Use the t
12270 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61  wo-part index na
12280 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
12290 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
122a0 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66    ** to search f
122b0 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46  or the table. 'F
122c0 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ix' the table na
122d0 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20  me to this db.  
122e0 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b    ** before look
122f0 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c 65  ing up the table
12300 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
12310 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70  ert( pName1 && p
12320 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62  Name2 );.    iDb
12330 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
12340 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
12350 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
12360 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69  Name);.    if( i
12370 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74  Db<0 ) goto exit
12380 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
12390 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
123a0 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f  MIT_TEMPDB.    /
123b0 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e  * If the index n
123c0 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66  ame was unqualif
123d0 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68  ied, check if th
123e0 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  e the table.    
123f0 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62  ** is a temp tab
12400 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74  le. If so, set t
12410 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31  he database to 1
12420 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 61  ..    */.    pTa
12430 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  b = sqlite3SrcLi
12440 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  stLookup(pParse,
12450 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20   pTblName);.    
12460 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e  if( pName2 && pN
12470 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54  ame2->n==0 && pT
12480 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  ab && pTab->pSch
12490 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
124a0 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
124b0 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a   iDb = 1;.    }.
124c0 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20  #endif..    if( 
124d0 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
124e0 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
124f0 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
12500 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71  e) &&.        sq
12510 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
12520 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
12530 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
12540 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72   Because the par
12550 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70  ser constructs p
12560 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73  TblName from a s
12570 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72  ingle identifier
12580 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  ,.      ** sqlit
12590 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e  e3FixSrcList can
125a0 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a   never fail. */.
125b0 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
125c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20  .    }.    pTab 
125d0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
125e0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 62  able(pParse, pTb
125f0 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  lName->a[0].zNam
12600 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c  e, .        pTbl
12610 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
12620 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21  base);.    if( !
12630 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74  pTab ) goto exit
12640 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12650 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
12660 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3d  Db[iDb].pSchema=
12670 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
12680 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
12690 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
126a0 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50  );.    pTab = pP
126b0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
126c0 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29  .    if( !pTab )
126d0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
126e0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62  e_index;.    iDb
126f0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
12700 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
12710 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ->pSchema);.  }.
12720 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
12730 5b 69 44 62 5d 3b 0a 0a 20 20 69 66 28 20 70 54  [iDb];..  if( pT
12740 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  ab==0 || pParse-
12750 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69  >nErr ) goto exi
12760 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12770 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64    if( pTab->read
12780 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  Only ){.    sqli
12790 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
127a0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
127b0 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
127c0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
127d0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
127e0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
127f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12800 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
12810 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
12820 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12830 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
12840 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  ews may not be i
12850 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
12860 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12870 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ndex;.  }.#endif
12880 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12890 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
128a0 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
128b0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
128c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
128d0 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20  Parse, "virtual 
128e0 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62  tables may not b
128f0 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
12900 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12910 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
12920 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  dif..  /*.  ** F
12930 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ind the name of 
12940 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  the index.  Make
12950 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
12960 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68  ot already anoth
12970 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  er.  ** index or
12980 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
12990 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a  same name.  .  *
129a0 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e  *.  ** Exception
129b0 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61  :  If we are rea
129c0 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f  ding the names o
129d0 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69  f permanent indi
129e0 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ces from the.  *
129f0 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
12a00 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73  table (because s
12a10 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
12a20 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63  s changed the sc
12a30 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f  hema) and.  ** o
12a40 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ne of the index 
12a50 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77  names collides w
12a60 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ith the name of 
12a70 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
12a80 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c  e or.  ** index,
12a90 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f   then we will co
12aa0 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73  ntinue to proces
12ab0 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  s this index..  
12ac0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65  **.  ** If pName
12ad0 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ==0 it means tha
12ae0 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65  t we are.  ** de
12af0 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69  aling with a pri
12b00 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51  mary key or UNIQ
12b10 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
12b20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e  We have to inven
12b30 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e  t our.  ** own n
12b40 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
12b50 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
12b60 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
12b70 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
12b80 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ame);.    if( SQ
12b90 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
12ba0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
12bb0 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  e) ) goto exit_c
12bc0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
12bd0 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
12be0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12bf0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
12c00 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
12c10 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
12c20 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
12c30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
12c40 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12c50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12c60 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
12c70 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  {.      if( SQLI
12c80 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
12c90 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
12ca0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
12cb0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
12cc0 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
12cd0 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
12ce0 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
12cf0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12d00 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
12d10 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61   is already a ta
12d20 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  ble named %s", z
12d30 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
12d40 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12d50 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
12d60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
12d70 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
12d80 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e  , zName, pDb->zN
12d90 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
12da0 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74   if( !ifNotExist
12db0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12dc0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12dd0 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c  se, "index %s al
12de0 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a  ready exists", z
12df0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
12e00 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
12e10 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
12e20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
12e30 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
12e40 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
12e50 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
12e60 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
12e70 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
12e80 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
12e90 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
12ea0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
12eb0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
12ec0 2c 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a  ,zBuf,"_%d",n);.
12ed0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
12ee0 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
12ef0 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c  ing(&zName, "sql
12f00 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c  ite_autoindex_",
12f10 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42   pTab->zName, zB
12f20 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  uf, (char*)0);. 
12f30 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
12f40 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  ){.      db->mal
12f50 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
12f60 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
12f70 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
12f80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
12f90 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61  ck for authoriza
12fa0 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
12fb0 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69  n index..  */.#i
12fc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12fd0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
12fe0 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68    {.    const ch
12ff0 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a  ar *zDb = pDb->z
13000 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
13010 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
13020 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
13030 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
13040 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29  LE(iDb), 0, zDb)
13050 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
13060 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13070 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
13080 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
13090 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d  DEX;.    if( !OM
130a0 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
130b0 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45  ==1 ) i = SQLITE
130c0 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
130d0 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
130e0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
130f0 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70  rse, i, zName, p
13100 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
13110 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
13120 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13130 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13140 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73  if..  /* If pLis
13150 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74  t==0, it means t
13160 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
13170 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61  called to make a
13180 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65   primary.  ** ke
13190 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73  y out of the las
131a0 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
131b0 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  o the table unde
131c0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
131d0 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61    ** So create a
131e0 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69   fake list to si
131f0 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a  mulate this..  *
13200 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  /.  if( pList==0
13210 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a   ){.    nullId.z
13220 20 3d 20 28 75 38 2a 29 70 54 61 62 2d 3e 61 43   = (u8*)pTab->aC
13230 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d  ol[pTab->nCol-1]
13240 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c  .zName;.    null
13250 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63  Id.n = strlen((c
13260 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a  har*)nullId.z);.
13270 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
13280 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
13290 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  d(pParse, 0, 0, 
132a0 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66  &nullId);.    if
132b0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
132c0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
132d0 64 65 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  dex;.    pList->
132e0 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
132f0 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a   sortOrder;.  }.
13300 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
13310 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20   how many bytes 
13320 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65 71  of space are req
13330 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65  uired to store e
13340 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73  xplicitly.  ** s
13350 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69  pecified collati
13360 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
13370 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
13380 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
13390 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
133a0 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74  r *pExpr = pList
133b0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
133c0 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
133d0 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28       nExtra += (
133e0 31 20 2b 20 73 74 72 6c 65 6e 28 70 45 78 70 72  1 + strlen(pExpr
133f0 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29  ->pColl->zName))
13400 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
13410 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
13420 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
13430 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e  ture. .  */.  nN
13440 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61  ame = strlen(zNa
13450 6d 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c  me);.  nCol = pL
13460 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
13470 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62  ndex = sqlite3Db
13480 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a  MallocZero(db, .
13490 20 20 20 20 20 20 73 69 7a 65 6f 66 28 49 6e 64        sizeof(Ind
134a0 65 78 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ex) +           
134b0 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75     /* Index stru
134c0 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20  cture  */.      
134d0 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c  sizeof(int)*nCol
134e0 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
134f0 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20  Index.aiColumn  
13500 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
13510 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b  (int)*(nCol+1) +
13520 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
13530 61 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20  aiRowEst   */.  
13540 20 20 20 20 73 69 7a 65 6f 66 28 63 68 61 72 20      sizeof(char 
13550 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  *)*nCol +       
13560 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c   /* Index.azColl
13570 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69       */.      si
13580 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 20 2b 20  zeof(u8)*nCol + 
13590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
135a0 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
135b0 2f 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20  /.      nName + 
135c0 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  1 +             
135d0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e       /* Index.zN
135e0 61 6d 65 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ame      */.    
135f0 20 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20    nExtra        
13600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13610 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  * Collation sequ
13620 65 6e 63 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  ence names */.  
13630 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
13640 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
13650 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13660 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70  e_index;.  }.  p
13670 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20  Index->azColl = 
13680 28 63 68 61 72 2a 2a 29 28 26 70 49 6e 64 65 78  (char**)(&pIndex
13690 5b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  [1]);.  pIndex->
136a0 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20  aiColumn = (int 
136b0 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  *)(&pIndex->azCo
136c0 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e  ll[nCol]);.  pIn
136d0 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20  dex->aiRowEst = 
136e0 28 75 6e 73 69 67 6e 65 64 20 2a 29 28 26 70 49  (unsigned *)(&pI
136f0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  ndex->aiColumn[n
13700 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Col]);.  pIndex-
13710 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
13720 38 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69  8 *)(&pIndex->ai
13730 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b  RowEst[nCol+1]);
13740 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
13750 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e   = (char *)(&pIn
13760 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
13770 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72 61  nCol]);.  zExtra
13780 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e   = (char *)(&pIn
13790 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65  dex->zName[nName
137a0 2b 31 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  +1]);.  memcpy(p
137b0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Index->zName, zN
137c0 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20  ame, nName+1);. 
137d0 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20   pIndex->pTable 
137e0 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78  = pTab;.  pIndex
137f0 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73  ->nColumn = pLis
13800 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64  t->nExpr;.  pInd
13810 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e  ex->onError = on
13820 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
13830 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61  >autoIndex = pNa
13840 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d  me==0;.  pIndex-
13850 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  >pSchema = db->a
13860 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
13870 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
13880 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64  see if we should
13890 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75   honor DESC requ
138a0 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f  ests on index co
138b0 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
138c0 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66   pDb->pSchema->f
138d0 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b  ile_format>=4 ){
138e0 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
138f0 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f  sk = -1;   /* Ho
13900 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65  nor DESC */.  }e
13910 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  lse{.    sortOrd
13920 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f  erMask = 0;    /
13930 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f  * Ignore DESC */
13940 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20  .  }..  /* Scan 
13950 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
13960 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
13970 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
13980 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61  xed and.  ** loa
13990 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64  d the column ind
139a0 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e  ices into the In
139b0 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20  dex structure.  
139c0 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a  Report an error.
139d0 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75    ** if any colu
139e0 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e  mn is not found.
139f0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
13a00 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74   pListItem=pList
13a10 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  ->a; i<pList->nE
13a20 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49  xpr; i++, pListI
13a30 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  tem++){.    cons
13a40 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65  t char *zColName
13a50 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e   = pListItem->zN
13a60 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  ame;.    Column 
13a70 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e  *pTabCol;.    in
13a80 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  t requestedSortO
13a90 72 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a  rder;.    char *
13aa0 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zColl;          
13ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
13ac0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
13ad0 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28  ame */..    for(
13ae0 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61  j=0, pTabCol=pTa
13af0 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d  b->aCol; j<pTab-
13b00 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62  >nCol; j++, pTab
13b10 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  Col++){.      if
13b20 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
13b30 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43  (zColName, pTabC
13b40 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  ol->zName)==0 ) 
13b50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
13b60 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
13b70 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
13b80 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13b90 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
13ba0 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
13bb0 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  d %s",.        p
13bc0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Tab->zName, zCol
13bd0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
13be0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13bf0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  dex;.    }.    /
13c00 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74  * TODO:  Add a t
13c10 65 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  est to make sure
13c20 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63   that the same c
13c30 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d  olumn is not nam
13c40 65 64 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74  ed.    ** more t
13c50 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e 20  han once within 
13c60 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20  the same index. 
13c70 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   Only the first 
13c80 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20 20 20  instance of.    
13c90 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69  ** the column wi
13ca0 6c 6c 20 65 76 65 72 20 62 65 20 75 73 65 64 20  ll ever be used 
13cb0 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72  by the optimizer
13cc0 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 75 73 69  .  Note that usi
13cd0 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 61  ng the.    ** sa
13ce0 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74  me column more t
13cf0 68 61 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f 74 20  han once cannot 
13d00 62 65 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  be an error beca
13d10 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 0a  use that would .
13d20 20 20 20 20 2a 2a 20 62 72 65 61 6b 20 62 61 63      ** break bac
13d30 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
13d40 6c 69 74 79 20 2d 20 69 74 20 6e 65 65 64 73 20  lity - it needs 
13d50 74 6f 20 62 65 20 61 20 77 61 72 6e 69 6e 67 2e  to be a warning.
13d60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 64  .    */.    pInd
13d70 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
13d80 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  = j;.    if( pLi
13d90 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 29 7b  stItem->pExpr ){
13da0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13db0 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
13dc0 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >pColl );.      
13dd0 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a  zColl = zExtra;.
13de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
13df0 70 72 69 6e 74 66 28 6e 45 78 74 72 61 2c 20 7a  printf(nExtra, z
13e00 45 78 74 72 61 2c 20 22 25 73 22 2c 20 70 4c 69  Extra, "%s", pLi
13e10 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70  stItem->pExpr->p
13e20 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
13e30 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 28 73      zExtra += (s
13e40 74 72 6c 65 6e 28 7a 43 6f 6c 6c 29 20 2b 20 31  trlen(zColl) + 1
13e50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13e60 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62      zColl = pTab
13e70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[j].zColl;
13e80 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  .      if( !zCol
13e90 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  l ){.        zCo
13ea0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
13eb0 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
13ec0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
13ed0 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
13ee0 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74  && !sqlite3Locat
13ef0 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
13f00 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20   zColl, -1) ){. 
13f10 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
13f20 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13f30 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
13f40 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c  zColl[i] = zColl
13f50 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53  ;.    requestedS
13f60 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
13f70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
13f80 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b  & sortOrderMask;
13f90 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f  .    pIndex->aSo
13fa0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 72 65 71  rtOrder[i] = req
13fb0 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
13fc0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
13fd0 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64  faultRowEst(pInd
13fe0 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  ex);..  if( pTab
13ff0 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
14000 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
14010 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
14020 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
14030 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
14040 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
14050 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
14060 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
14070 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
14080 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
14090 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
140a0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
140b0 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
140c0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
140d0 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
140e0 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
140f0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
14100 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
14110 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
14120 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
14130 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
14140 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
14150 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
14160 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
14170 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
14180 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
14190 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
141a0 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
141b0 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
141c0 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
141d0 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
141e0 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
141f0 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
14200 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
14210 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
14220 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
14230 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
14240 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
14250 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
14260 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
14270 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
14280 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
14290 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
142a0 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72  sert( pIdx->onEr
142b0 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
142c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
142d0 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b  dx->autoIndex );
142e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
142f0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
14300 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20  OE_None );..    
14310 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
14320 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  umn!=pIndex->nCo
14330 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
14340 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  .      for(k=0; 
14350 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  k<pIdx->nColumn;
14360 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   k++){.        c
14370 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 20 3d 20  onst char *z1 = 
14380 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  pIdx->azColl[k];
14390 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
143a0 68 61 72 20 2a 7a 32 20 3d 20 70 49 6e 64 65 78  har *z2 = pIndex
143b0 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
143c0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
143d0 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64  iColumn[k]!=pInd
143e0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20  ex->aiColumn[k] 
143f0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
14400 20 69 66 28 20 70 49 64 78 2d 3e 61 53 6f 72 74   if( pIdx->aSort
14410 4f 72 64 65 72 5b 6b 5d 21 3d 70 49 6e 64 65 78  Order[k]!=pIndex
14420 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 20  ->aSortOrder[k] 
14430 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
14440 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20 73   if( z1!=z2 && s
14450 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
14460 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20  , z2) ) break;. 
14470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14480 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   k==pIdx->nColum
14490 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  n ){.        if(
144a0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
144b0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
144c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
144d0 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  This constraint 
144e0 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65  creates the same
144f0 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76   index as a prev
14500 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
14510 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65  * constraint spe
14520 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65  cified somewhere
14530 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
14540 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
14550 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77            ** How
14560 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46  ever the ON CONF
14570 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65  LICT clauses are
14580 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62   different. If b
14590 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20  oth this .      
145a0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
145b0 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  t and the previo
145c0 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  us equivalent co
145d0 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78  nstraint have ex
145e0 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20  plicit.         
145f0 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   ** ON CONFLICT 
14600 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20  clauses this is 
14610 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77  an error. Otherw
14620 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20  ise, use the.   
14630 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63         ** explic
14640 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62  itly specified b
14650 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65  ehaviour for the
14660 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
14670 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
14680 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72  f( !(pIdx->onErr
14690 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c  or==OE_Default |
146a0 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  | pIndex->onErro
146b0 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29  r==OE_Default) )
146c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
146d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
146e0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
146f0 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74         "conflict
14700 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ing ON CONFLICT 
14710 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65  clauses specifie
14720 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  d", 0);.        
14730 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
14740 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
14750 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
14760 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
14770 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65  >onError = pInde
14780 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  x->onError;.    
14790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
147a0 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
147b0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
147c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
147d0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
147e0 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72  he new Index str
147f0 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61  ucture to its ta
14800 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f  ble and to the o
14810 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d  ther.  ** in-mem
14820 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
14830 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20  uctures. .  */. 
14840 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
14850 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  sy ){.    Index 
14860 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  *p;.    p = sqli
14870 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
14880 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e  Index->pSchema->
14890 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20  idxHash, .      
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148b0 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
148c0 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d  , strlen(pIndex-
148d0 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65  >zName)+1, pInde
148e0 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  x);.    if( p ){
148f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14900 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20  ==pIndex );  /* 
14910 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
14920 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
14930 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
14940 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  d = 1;.      got
14950 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
14960 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  dex;.    }.    d
14970 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
14980 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
14990 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61  ;.    if( pTblNa
149a0 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  me!=0 ){.      p
149b0 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62  Index->tnum = db
149c0 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a  ->init.newTnum;.
149d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
149e0 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
149f0 62 75 73 79 20 69 73 20 30 20 74 68 65 6e 20 63  busy is 0 then c
14a00 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  reate the index 
14a10 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20  on disk.  This. 
14a20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69   ** involves wri
14a30 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69  ting the index i
14a40 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74  nto the master t
14a50 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67  able and filling
14a60 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   in the.  ** ind
14a70 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ex with the curr
14a80 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e  ent table conten
14a90 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ts..  **.  ** Th
14aa0 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
14ab0 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75 73  is 0 when the us
14ac0 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73 20  er first enters 
14ad0 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a  a CREATE INDEX .
14ae0 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64    ** command.  d
14af0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
14b00 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  1 when a databas
14b10 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20  e is opened and 
14b20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44  .  ** CREATE IND
14b30 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  EX statements ar
14b40 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68  e read out of th
14b50 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e master table. 
14b60 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74   In.  ** the lat
14b70 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64  ter case the ind
14b80 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
14b90 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68  s on disk, which
14ba0 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20   is why.  ** we 
14bb0 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65  don't want to re
14bc0 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a  create it..  **.
14bd0 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65    ** If pTblName
14be0 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
14bf0 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72  s index is gener
14c00 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72  ated as a primar
14c10 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e  y key.  ** or UN
14c20 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
14c30 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  of a CREATE TABL
14c40 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69  E statement.  Si
14c50 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  nce the table.  
14c60 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
14c70 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e   created, it con
14c80 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e  tains no data an
14c90 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74  d the index init
14ca0 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
14cb0 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70  step can be skip
14cc0 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
14cd0 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
14ce0 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62  sy==0 ){.    Vdb
14cf0 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
14d00 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69  zStmt;.    int i
14d10 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
14d20 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d 20 73  em++;..    v = s
14d30 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
14d40 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
14d50 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
14d60 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a  create_index;...
14d70 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
14d80 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74  e rootpage for t
14d90 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a  he index.    */.
14da0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
14db0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
14dc0 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
14dd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14de0 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74  ddOp(v, OP_Creat
14df0 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 29 3b  eIndex, iDb, 0);
14e00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14e10 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
14e20 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a  tore, iMem, 0);.
14e30 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74  .    /* Gather t
14e40 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
14e50 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49   of the CREATE I
14e60 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69  NDEX statement i
14e70 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a  nto.    ** the z
14e80 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20  Stmt variable.  
14e90 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
14ea0 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20  art && pEnd ){. 
14eb0 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20       /* A named 
14ec0 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78  index with an ex
14ed0 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e  plicit CREATE IN
14ee0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
14ef0 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
14f00 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
14f10 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45  , "CREATE%s INDE
14f20 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20  X %.*s",.       
14f30 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e   onError==OE_Non
14f40 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55  e ? "" : " UNIQU
14f50 45 22 2c 0a 20 20 20 20 20 20 20 20 70 45 6e 64  E",.        pEnd
14f60 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b  ->z - pName->z +
14f70 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d   1,.        pNam
14f80 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e->z);.    }else
14f90 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75  {.      /* An au
14fa0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72  tomatic index cr
14fb0 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41  eated by a PRIMA
14fc0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
14fd0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
14fe0 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20       /* zStmt = 
14ff0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
15000 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  "); */.      zSt
15010 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  mt = 0;.    }.. 
15020 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74     /* Add an ent
15030 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73  ry in sqlite_mas
15040 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ter for this ind
15050 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ex.    */.    sq
15060 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
15070 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
15080 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25    "INSERT INTO %
15090 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64  Q.%s VALUES('ind
150a0 65 78 27 2c 25 51 2c 25 51 2c 23 30 2c 25 51 29  ex',%Q,%Q,#0,%Q)
150b0 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  ;",.        db->
150c0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
150d0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
150e0 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ),.        pInde
150f0 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  x->zName,.      
15100 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
15110 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20         zStmt.   
15120 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
15130 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
15140 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  op, 1, 0);.    s
15150 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 74 6d  qlite3_free(zStm
15160 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c  t);..    /* Fill
15170 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
15180 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65  data and reparse
15190 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64   the schema. Cod
151a0 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20  e an OP_Expire. 
151b0 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64     ** to invalid
151c0 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70  ate all pre-comp
151d0 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
151e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
151f0 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
15200 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
15210 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
15220 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
15230 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
15240 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62  ookie(db, v, iDb
15250 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15260 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61  VdbeOp3(v, OP_Pa
15270 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
15280 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  0,.         sqli
15290 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
152a0 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64  name='%q'", pInd
152b0 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44  ex->zName), P3_D
152c0 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73  YNAMIC);.      s
152d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
152e0 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c  v, OP_Expire, 0,
152f0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
15300 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67    /* When adding
15310 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65   an index to the
15320 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73   list of indices
15330 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61   for a table, ma
15340 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c  ke.  ** sure all
15350 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64   indices labeled
15360 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65   OE_Replace come
15370 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65   after all those
15380 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45   labeled.  ** OE
15390 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69  _Ignore.  This i
153a0 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20  s necessary for 
153b0 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
153c0 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a  ation of UPDATE.
153d0 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e    ** and INSERT.
153e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
153f0 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62  init.busy || pTb
15400 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  lName==0 ){.    
15410 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  if( onError!=OE_
15420 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d  Replace || pTab-
15430 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20  >pIndex==0.     
15440 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e      || pTab->pIn
15450 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
15460 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20  _Replace){.     
15470 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
15480 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
15490 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65       pTab->pInde
154a0 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
154b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
154c0 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
154d0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
154e0 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
154f0 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
15500 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
15510 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
15520 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20         pOther = 
15530 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
15540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
15550 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74  dex->pNext = pOt
15560 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
15570 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20    pOther->pNext 
15580 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  = pIndex;.    }.
15590 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
155a0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
155b0 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
155c0 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
155d0 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49  _index:.  if( pI
155e0 6e 64 65 78 20 29 7b 0a 20 20 20 20 66 72 65 65  ndex ){.    free
155f0 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20  Index(pIndex);. 
15600 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
15610 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
15620 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
15630 69 73 74 44 65 6c 65 74 65 28 70 54 62 6c 4e 61  istDelete(pTblNa
15640 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  me);.  sqlite3_f
15650 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
15660 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  turn;.}../*.** G
15670 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
15680 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 66 69  make sure the fi
15690 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72  le format number
156a0 20 69 73 20 61 74 20 6c 65 61 73 74 20 6d 69 6e   is at least min
156b0 46 6f 72 6d 61 74 2e 0a 2a 2a 20 54 68 65 20 67  Format..** The g
156c0 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20 77 69  enerated code wi
156d0 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  ll increase the 
156e0 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62  file format numb
156f0 65 72 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  er if necessary.
15700 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15710 4d 69 6e 69 6d 75 6d 46 69 6c 65 46 6f 72 6d 61  MinimumFileForma
15720 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
15730 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 6d 69   int iDb, int mi
15740 6e 46 6f 72 6d 61 74 29 7b 0a 20 20 56 64 62 65  nFormat){.  Vdbe
15750 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74   *v;.  v = sqlit
15760 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
15770 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
15780 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15790 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f  Op(v, OP_ReadCoo
157a0 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20  kie, iDb, 1);.  
157b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
157c0 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
157d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
157e0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
157f0 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 30  er, minFormat, 0
15800 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15810 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65  beAddOp(v, OP_Ge
15820 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65  , 0, sqlite3Vdbe
15830 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
15840 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15850 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
15860 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74  teger, minFormat
15870 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
15880 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15890 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
158a0 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
158b0 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78  * Fill the Index
158c0 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61  .aiRowEst[] arra
158d0 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69  y with default i
158e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66  nformation - inf
158f0 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  ormation.** to b
15900 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68  e used when we h
15910 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20  ave not run the 
15920 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
15930 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b  .**.** aiRowEst[
15940 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f  0] is suppose to
15950 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
15960 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
15970 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  in the index..**
15980 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   Since we do not
15990 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d   know, guess 1 m
159a0 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73  illion.  aiRowEs
159b0 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[1] is an estim
159c0 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  ate of the.** nu
159d0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
159e0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d  the table that m
159f0 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
15a00 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65  lar value of the
15a10 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  .** first column
15a20 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
15a30 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61  aiRowEst[2] is a
15a40 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
15a50 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72  e number.** of r
15a60 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  ows that match a
15a70 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f  ny particular co
15a80 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68  mbiniation of th
15a90 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e  e first 2 column
15aa0 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65  s.** of the inde
15ab0 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  x.  And so forth
15ac0 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79  .  It must alway
15ad0 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  s be the case th
15ae0 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  at.*.**         
15af0 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61    aiRowEst[N]<=a
15b00 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20  iRowEst[N-1].** 
15b10 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
15b20 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41  st[N]>=1.**.** A
15b30 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20  part from that, 
15b40 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74  we have little t
15b50 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20  o go on besides 
15b60 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a  intuition as to.
15b70 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b  ** how aiRowEst[
15b80 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  ] should be init
15b90 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75  ialized.  The nu
15ba0 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20  mbers generated 
15bb0 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65  here.** are base
15bc0 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c  d on typical val
15bd0 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74  ues found in act
15be0 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a  ual indices..*/.
15bf0 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61  void sqlite3Defa
15c00 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20  ultRowEst(Index 
15c10 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e  *pIdx){.  unsign
15c20 65 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69  ed *a = pIdx->ai
15c30 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b  RowEst;.  int i;
15c40 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d 30 20  .  assert( a!=0 
15c50 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30 30  );.  a[0] = 1000
15c60 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64  000;.  for(i=pId
15c70 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 35  x->nColumn; i>=5
15c80 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d  ; i--){.    a[i]
15c90 20 3d 20 35 3b 0a 20 20 7d 0a 20 20 77 68 69 6c   = 5;.  }.  whil
15ca0 65 28 20 69 3e 3d 31 20 29 7b 0a 20 20 20 20 61  e( i>=1 ){.    a
15cb0 5b 69 5d 20 3d 20 31 31 20 2d 20 69 3b 0a 20 20  [i] = 11 - i;.  
15cc0 20 20 69 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28    i--;.  }.  if(
15cd0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
15ce0 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61  OE_None ){.    a
15cf0 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20  [pIdx->nColumn] 
15d00 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
15d10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
15d20 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73  ill drop an exis
15d30 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78  ting named index
15d40 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
15d50 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
15d60 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  e DROP INDEX sta
15d70 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
15d80 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
15d90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15da0 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
15db0 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20  int ifExists){. 
15dc0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
15dd0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
15de0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
15df0 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
15e00 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
15e10 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
15e20 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
15e30 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
15e40 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73  index;.  }.  ass
15e50 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
15e60 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ==1 );.  if( SQL
15e70 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
15e80 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
15e90 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
15ea0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
15eb0 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
15ec0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
15ed0 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
15ee0 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
15ef0 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
15f00 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
15f10 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73  .    if( !ifExis
15f20 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts ){.      sqli
15f30 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15f40 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
15f50 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  ex: %S", pName, 
15f60 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  0);.    }.    pP
15f70 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
15f80 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
15f90 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
15fa0 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
15fb0 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a  x->autoIndex ){.
15fc0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
15fd0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
15fe0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
15ff0 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20  th UNIQUE ".    
16000 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45    "or PRIMARY KE
16010 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Y constraint can
16020 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
16030 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
16040 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
16050 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
16060 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
16070 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  db, pIndex->pSch
16080 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ema);.#ifndef SQ
16090 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
160a0 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
160b0 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  int code = SQLIT
160c0 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20  E_DROP_INDEX;.  
160d0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
160e0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a  pIndex->pTable;.
160f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
16100 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
16110 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  b].zName;.    co
16120 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
16130 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
16140 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  b);.    if( sqli
16150 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
16160 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
16170 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
16180 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
16190 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
161a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
161b0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
161c0 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49  Db ) code = SQLI
161d0 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
161e0 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
161f0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
16200 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65  rse, code, pInde
16210 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  x->zName, pTab->
16220 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
16230 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
16240 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
16250 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
16260 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16270 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
16280 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
16290 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
162a0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
162b0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
162c0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
162d0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
162e0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
162f0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
16300 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  %s WHERE name=%Q
16310 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
16320 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
16330 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
16340 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  .       pIndex->
16350 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
16360 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
16370 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29  okie(db, v, iDb)
16380 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
16390 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
163a0 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  ndex->tnum, iDb)
163b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
163c0 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49  eOp3(v, OP_DropI
163d0 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 70 49  ndex, iDb, 0, pI
163e0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
163f0 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
16400 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33  index:.  sqlite3
16410 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e  SrcListDelete(pN
16420 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ame);.}../*.** p
16430 41 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74  Array is a point
16440 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f  er to an array o
16450 66 20 6f 62 6a 65 63 74 73 2e 20 20 45 61 63 68  f objects.  Each
16460 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a   object in the.*
16470 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74  * array is szEnt
16480 72 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ry bytes in size
16490 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
164a0 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 0a  allocates a new.
164b0 2a 2a 20 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65  ** object on the
164c0 20 65 6e 64 20 6f 66 20 74 68 65 20 61 72 72 61   end of the arra
164d0 79 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72  y..**.** *pnEntr
164e0 79 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  y is the number 
164f0 6f 66 20 65 6e 74 72 69 65 73 20 61 6c 72 65 61  of entries alrea
16500 64 79 20 69 6e 20 75 73 65 2e 20 20 2a 70 6e 41  dy in use.  *pnA
16510 6c 6c 6f 63 20 69 73 0a 2a 2a 20 74 68 65 20 70  lloc is.** the p
16520 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
16530 74 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ted size of the 
16540 61 72 72 61 79 2e 20 20 69 6e 69 74 53 69 7a 65  array.  initSize
16550 20 69 73 20 74 68 65 0a 2a 2a 20 73 75 67 67 65   is the.** sugge
16560 73 74 65 64 20 69 6e 69 74 69 61 6c 20 61 72 72  sted initial arr
16570 61 79 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 69  ay size allocati
16580 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  on..**.** The in
16590 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 65  dex of the new e
165a0 6e 74 72 79 20 69 73 20 72 65 74 75 72 6e 65 64  ntry is returned
165b0 20 69 6e 20 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a   in *pIdx..**.**
165c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
165d0 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
165e0 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
165f0 6f 62 6a 65 63 74 73 2e 20 20 54 68 69 73 0a 2a  objects.  This.*
16600 2a 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 73  * might be the s
16610 61 6d 65 20 61 73 20 74 68 65 20 70 41 72 72 61  ame as the pArra
16620 79 20 70 61 72 61 6d 65 74 65 72 20 6f 72 20 69  y parameter or i
16630 74 20 6d 69 67 68 74 20 62 65 20 61 20 64 69 66  t might be a dif
16640 66 65 72 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65  ferent.** pointe
16650 72 20 69 66 20 74 68 65 20 61 72 72 61 79 20 77  r if the array w
16660 61 73 20 72 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76  as resized..*/.v
16670 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61  oid *sqlite3Arra
16680 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c  yAllocate(.  sql
16690 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f  ite3 *db,      /
166a0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * Connection to 
166b0 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63  notify of malloc
166c0 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76   failures */.  v
166d0 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20  oid *pArray,    
166e0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a   /* Array of obj
166f0 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20  ects.  Might be 
16700 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  reallocated */. 
16710 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20   int szEntry,   
16720 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61     /* Size of ea
16730 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ch object in the
16740 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
16750 69 6e 69 74 53 69 7a 65 2c 20 20 20 20 20 2f 2a  initSize,     /*
16760 20 53 75 67 67 65 73 74 65 64 20 69 6e 69 74 69   Suggested initi
16770 61 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69  al allocation, i
16780 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  n elements */.  
16790 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20  int *pnEntry,   
167a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
167b0 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79  bjects currently
167c0 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74   in use */.  int
167d0 20 2a 70 6e 41 6c 6c 6f 63 2c 20 20 20 20 20 2f   *pnAlloc,     /
167e0 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  * Current size o
167f0 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
16800 2c 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  , in elements */
16810 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20  .  int *pIdx    
16820 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
16830 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77  e index of a new
16840 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b   slot here */.){
16850 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
16860 28 20 2a 70 6e 45 6e 74 72 79 20 3e 3d 20 2a 70  ( *pnEntry >= *p
16870 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 76 6f  nAlloc ){.    vo
16880 69 64 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e  id *pNew;.    in
16890 74 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e  t newSize;.    n
168a0 65 77 53 69 7a 65 20 3d 20 28 2a 70 6e 41 6c 6c  ewSize = (*pnAll
168b0 6f 63 29 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65  oc)*2 + initSize
168c0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
168d0 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
168e0 2c 20 70 41 72 72 61 79 2c 20 6e 65 77 53 69 7a  , pArray, newSiz
168f0 65 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20  e*szEntry);.    
16900 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
16910 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b       *pIdx = -1;
16920 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41  .      return pA
16930 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rray;.    }.    
16940 2a 70 6e 41 6c 6c 6f 63 20 3d 20 6e 65 77 53 69  *pnAlloc = newSi
16950 7a 65 3b 0a 20 20 20 20 70 41 72 72 61 79 20 3d  ze;.    pArray =
16960 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d   pNew;.  }.  z =
16970 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a   (char*)pArray;.
16980 20 20 6d 65 6d 73 65 74 28 26 7a 5b 2a 70 6e 45    memset(&z[*pnE
16990 6e 74 72 79 20 2a 20 73 7a 45 6e 74 72 79 5d 2c  ntry * szEntry],
169a0 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20   0, szEntry);.  
169b0 2a 70 49 64 78 20 3d 20 2a 70 6e 45 6e 74 72 79  *pIdx = *pnEntry
169c0 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a  ;.  ++*pnEntry;.
169d0 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b    return pArray;
169e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
169f0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
16a00 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69  o the given IdLi
16a10 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
16a20 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e  w IdList if.** n
16a30 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  eed be..**.** A 
16a40 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65  new IdList is re
16a50 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
16a60 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
16a70 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71  s..*/.IdList *sq
16a80 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
16a90 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  d(sqlite3 *db, I
16aa0 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  dList *pList, To
16ab0 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
16ac0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
16ad0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
16ae0 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
16af0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
16b00 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
16b10 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
16b20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
16b30 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
16b40 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e  0;.  }.  pList->
16b50 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  a = sqlite3Array
16b60 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
16b70 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d  db,.      pList-
16b80 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  >a,.      sizeof
16b90 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20  (pList->a[0]),. 
16ba0 20 20 20 20 20 35 2c 0a 20 20 20 20 20 20 26 70       5,.      &p
16bb0 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20  List->nId,.     
16bc0 20 26 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2c   &pList->nAlloc,
16bd0 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20  .      &i.  );. 
16be0 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
16bf0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
16c00 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
16c10 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
16c20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
16c30 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
16c40 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
16c50 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ken);.  return p
16c60 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  List;.}../*.** D
16c70 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e  elete an IdList.
16c80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16c90 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64 4c  IdListDelete(IdL
16ca0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
16cb0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
16cc0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
16cd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
16ce0 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
16cf0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
16d00 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
16d10 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
16d20 5f 66 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b  _free(pList->a);
16d30 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
16d40 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
16d50 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
16d60 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
16d70 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
16d80 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
16d90 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
16da0 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
16db0 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64  e3IdListIndex(Id
16dc0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e  List *pList, con
16dd0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
16de0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
16df0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
16e00 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  n -1;.  for(i=0;
16e10 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
16e20 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
16e30 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
16e40 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
16e50 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
16e60 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
16e70 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n -1;.}../*.** A
16e80 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c  ppend a new tabl
16e90 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69  e name to the gi
16ea0 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72  ven SrcList.  Cr
16eb0 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69  eate a new SrcLi
16ec0 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
16ed0 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
16ee0 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  s created in the
16ef0 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66   SrcList even if
16f00 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e   pToken is NULL.
16f10 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63  .**.** A new Src
16f20 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
16f30 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
16f40 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a  loc() fails..**.
16f50 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
16f60 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
16f70 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
16f80 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
16f90 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
16fa0 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
16fb0 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
16fc0 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
16fd0 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
16fe0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
16ff0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
17000 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
17010 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
17020 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
17030 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
17040 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
17050 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
17060 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
17070 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
17080 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
17090 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
170a0 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
170b0 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
170c0 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
170d0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
170e0 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
170f0 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
17100 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
17110 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
17120 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
17130 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
17140 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
17150 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
17160 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
17170 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,0);.**.** The
17180 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e  n B is a table n
17190 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
171a0 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73  base name is uns
171b0 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61  pecified.  If ca
171c0 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  lled.** like thi
171d0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
171e0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
171f0 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a  ppend(D,A,B,C);.
17200 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
17210 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
17220 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
17230 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72  base name..*/.Sr
17240 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
17250 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73  cListAppend(.  s
17260 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
17270 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
17280 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
17290 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
172a0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  .  SrcList *pLis
172b0 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  t,     /* Append
172c0 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74   to this SrcList
172d0 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61  . NULL creates a
172e0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a   new SrcList */.
172f0 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
17300 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
17310 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f  o append */.  To
17320 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20  ken *pDatabase  
17330 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66    /* Database of
17340 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b   the table */.){
17350 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
17360 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
17370 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
17380 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
17390 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
173a0 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c  (db, sizeof(SrcL
173b0 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
173c0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
173d0 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  n 0;.    pList->
173e0 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a  nAlloc = 1;.  }.
173f0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72    if( pList->nSr
17400 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  c>=pList->nAlloc
17410 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
17420 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73 74  *pNew;.    pList
17430 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20  ->nAlloc *= 2;. 
17440 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
17450 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
17460 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  List,.          
17470 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69       sizeof(*pLi
17480 73 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41  st) + (pList->nA
17490 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70  lloc-1)*sizeof(p
174a0 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  List->a[0]) );. 
174b0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
174c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
174d0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  rcListDelete(pLi
174e0 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
174f0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
17500 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
17510 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
17520 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
17530 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65  ];.  memset(pIte
17540 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69  m, 0, sizeof(pLi
17550 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66  st->a[0]));.  if
17560 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
17570 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29  Database->z==0 )
17580 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  {.    pDatabase 
17590 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
175a0 44 61 74 61 62 61 73 65 20 26 26 20 70 54 61 62  Database && pTab
175b0 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  le ){.    Token 
175c0 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61  *pTemp = pDataba
175d0 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73  se;.    pDatabas
175e0 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20  e = pTable;.    
175f0 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a  pTable = pTemp;.
17600 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61    }.  pItem->zNa
17610 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
17620 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
17630 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  able);.  pItem->
17640 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
17650 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
17660 28 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b  (db, pDatabase);
17670 0a 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  .  pItem->iCurso
17680 72 20 3d 20 2d 31 3b 0a 20 20 70 49 74 65 6d 2d  r = -1;.  pItem-
17690 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 30  >isPopulated = 0
176a0 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b  ;.  pList->nSrc+
176b0 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  +;.  return pLis
176c0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  t;.}../*.** Assi
176d0 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c  gn cursors to al
176e0 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72  l tables in a Sr
176f0 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  cList.*/.void sq
17700 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
17710 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20  gnCursors(Parse 
17720 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
17730 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
17740 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
17750 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
17760 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20  .  assert(pList 
17770 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
17780 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
17790 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
177a0 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
177b0 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69  =pList->a; i<pLi
177c0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
177d0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Item++){.      i
177e0 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  f( pItem->iCurso
177f0 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r>=0 ) break;.  
17800 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73      pItem->iCurs
17810 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
17820 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b++;.      if( p
17830 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
17840 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17850 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
17860 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74  sors(pParse, pIt
17870 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72  em->pSelect->pSr
17880 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
17890 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
178a0 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
178b0 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e  SrcList includin
178c0 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72  g all its substr
178d0 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  ucture..*/.void 
178e0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
178f0 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70 4c  lete(SrcList *pL
17900 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
17910 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
17920 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
17930 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
17940 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65  turn;.  for(pIte
17950 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
17960 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
17970 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
17980 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17990 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
179a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
179b0 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  ree(pItem->zName
179c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
179d0 72 65 65 28 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  ree(pItem->zAlia
179e0 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  s);.    sqlite3D
179f0 65 6c 65 74 65 54 61 62 6c 65 28 70 49 74 65 6d  eleteTable(pItem
17a00 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  ->pTab);.    sql
17a10 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
17a20 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29  (pItem->pSelect)
17a30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
17a40 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  rDelete(pItem->p
17a50 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
17a60 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49 74  IdListDelete(pIt
17a70 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
17a80 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
17a90 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
17aa0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
17ab0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
17ac0 61 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e  arser to add a n
17ad0 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a  ew term to the.*
17ae0 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69  * end of a growi
17af0 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ng FROM clause. 
17b00 20 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   The "p" paramet
17b10 65 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f  er is the part o
17b20 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  f.** the FROM cl
17b30 61 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c  ause that has al
17b40 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74  ready been const
17b50 72 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20  ructed.  "p" is 
17b60 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20  NULL.** if this 
17b70 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72  is the first ter
17b80 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
17b90 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e  ause.  pTable an
17ba0 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61  d pDatabase.** a
17bb0 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  re the name of t
17bc0 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74  he table and dat
17bd0 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74  abase named in t
17be0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
17bf0 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73  erm..** pDatabas
17c00 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  e is NULL if the
17c10 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71   database name q
17c20 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73  ualifier is miss
17c30 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75  ing - the.** usu
17c40 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65  al case.  If the
17c50 20 74 65 72 6d 20 68 61 73 20 61 20 61 6c 69 61   term has a alia
17c60 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70  s, then pAlias p
17c70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
17c80 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66  alias token.  If
17c90 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73   the term is a s
17ca0 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53  ubquery, then pS
17cb0 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a  ubquery is the.*
17cc0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
17cd0 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62 71  nt that the subq
17ce0 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54  uery encodes.  T
17cf0 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a  he pTable and.**
17d00 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61 6d   pDatabase param
17d10 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66  eters are NULL f
17d20 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  or subqueries.  
17d30 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69  The pOn and pUsi
17d40 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  ng.** parameters
17d50 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74   are the content
17d60 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55   of the ON and U
17d70 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SING clauses..**
17d80 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77  .** Return a new
17d90 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20 65   SrcList which e
17da0 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46 52  ncodes is the FR
17db0 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a  OM with the new.
17dc0 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a  ** term added..*
17dd0 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
17de0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
17df0 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65  romTerm(.  Parse
17e00 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
17e10 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
17e20 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
17e30 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  st *p,          
17e40 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70     /* The left p
17e50 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  art of the FROM 
17e60 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 73  clause already s
17e70 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  een */.  Token *
17e80 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  pTable,         
17e90 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
17ea0 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20  table to add to 
17eb0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
17ec0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
17ed0 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  abase,       /* 
17ee0 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
17ef0 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
17f00 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65  pTable */.  Toke
17f10 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20  n *pAlias,      
17f20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
17f30 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
17f40 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73 69  e AS subexpressi
17f50 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
17f60 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20 20  pSubquery,      
17f70 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75 73  /* A subquery us
17f80 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
17f90 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
17fa0 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20   Expr *pOn,     
17fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17fc0 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  ON clause of a j
17fd0 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  oin */.  IdList 
17fe0 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20  *pUsing         
17ff0 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c   /* The USING cl
18000 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
18010 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
18020 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
18030 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
18040 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
18050 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c   p = sqlite3SrcL
18060 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c  istAppend(db, p,
18070 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61   pTable, pDataba
18080 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
18090 7c 7c 20 70 2d 3e 6e 53 72 63 3d 3d 30 20 29 7b  || p->nSrc==0 ){
180a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
180b0 44 65 6c 65 74 65 28 70 4f 6e 29 3b 0a 20 20 20  Delete(pOn);.   
180c0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
180d0 6c 65 74 65 28 70 55 73 69 6e 67 29 3b 0a 20 20  lete(pUsing);.  
180e0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
180f0 65 6c 65 74 65 28 70 53 75 62 71 75 65 72 79 29  elete(pSubquery)
18100 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a  ;.    return p;.
18110 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
18120 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
18130 20 20 69 66 28 20 70 41 6c 69 61 73 20 26 26 20    if( pAlias && 
18140 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20  pAlias->n ){.   
18150 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d   pItem->zAlias =
18160 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
18170 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73  Token(db, pAlias
18180 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  );.  }.  pItem->
18190 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75  pSelect = pSubqu
181a0 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f  ery;.  pItem->pO
181b0 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d  n = pOn;.  pItem
181c0 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e  ->pUsing = pUsin
181d0 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  g;.  return p;.}
181e0 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69  ../*.** When bui
181f0 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20  lding up a FROM 
18200 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70 61  clause in the pa
18210 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f  rser, the join o
18220 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e  perator.** is in
18230 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64  itially attached
18240 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65   to the left ope
18250 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63  rand.  But the c
18260 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
18270 20 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69   expects the joi
18280 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65  n operator to be
18290 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70   on the right op
182a0 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75  erand.  This rou
182b0 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61  tine.** Shifts a
182c0 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  ll join operator
182d0 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  s from left to r
182e0 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69  ight for an enti
182f0 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73  re FROM.** claus
18300 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  e..**.** Example
18310 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f  : Suppose the jo
18320 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a  in is like this:
18330 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
18340 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73   A natural cross
18350 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68   join B.**.** Th
18360 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e  e operator is "n
18370 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
18380 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42  n".  The A and B
18390 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73 74   operands are st
183a0 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b  ored.** in p->a[
183b0 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20  0] and p->a[1], 
183c0 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54  respectively.  T
183d0 68 65 20 70 61 72 73 65 72 20 69 6e 69 74 69 61  he parser initia
183e0 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a  lly stores the.*
183f0 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  * operator with 
18400 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  A.  This routine
18410 20 73 68 69 66 74 73 20 74 68 61 74 20 6f 70 65   shifts that ope
18420 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e  rator over to B.
18430 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18440 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e  SrcListShiftJoin
18450 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29  Type(SrcList *p)
18460 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  {.  if( p && p->
18470 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  a ){.    int i;.
18480 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72      for(i=p->nSr
18490 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  c-1; i>0; i--){.
184a0 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f        p->a[i].jo
184b0 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d  intype = p->a[i-
184c0 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  1].jointype;.   
184d0 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a   }.    p->a[0].j
184e0 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d  ointype = 0;.  }
184f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
18500 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
18510 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
18520 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  inTransaction(Pa
18530 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
18540 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65   type){.  sqlite
18550 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
18560 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  ;.  int i;..  if
18570 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
18580 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
18590 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
185a0 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
185b0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
185c0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
185d0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
185e0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
185f0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
18600 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
18610 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  ION, "BEGIN", 0,
18620 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
18630 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
18640 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
18650 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a  f( !v ) return;.
18660 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44    if( type!=TK_D
18670 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66  EFERRED ){.    f
18680 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
18690 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  b; i++){.      s
186a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
186b0 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
186c0 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f  n, i, (type==TK_
186d0 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20  EXCLUSIVE)+1);. 
186e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
186f0 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b  UsesBtree(v, i);
18700 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
18710 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
18720 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
18730 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
18740 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63  Commit a transac
18750 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
18760 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61  ite3CommitTransa
18770 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
18780 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
18790 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
187a0 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
187b0 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
187c0 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
187d0 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
187e0 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
187f0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
18800 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
18810 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
18820 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
18830 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
18840 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49  NSACTION, "COMMI
18850 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  T", 0, 0) ) retu
18860 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  rn;..  v = sqlit
18870 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
18880 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
18890 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
188a0 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  Op(v, OP_AutoCom
188b0 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  mit, 1, 0);.  }.
188c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
188d0 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  k a transaction.
188e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
188f0 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69  ollbackTransacti
18900 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
18910 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
18920 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
18930 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
18940 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
18950 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
18960 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
18970 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
18980 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
18990 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
189a0 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
189b0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
189c0 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
189d0 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b  CTION, "ROLLBACK
189e0 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
189f0 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  n;..  v = sqlite
18a00 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
18a10 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
18a20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18a30 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  p(v, OP_AutoComm
18a40 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d  it, 1, 1);.  }.}
18a50 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
18a60 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62  e the TEMP datab
18a70 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ase is open and 
18a80 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
18a90 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  e.  Return.** th
18aa0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
18ab0 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65  rs.  Leave any e
18ac0 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
18ad0 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
18ae0 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
18af0 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
18b00 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61  abase(Parse *pPa
18b10 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
18b20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
18b30 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  ;.  if( db->aDb[
18b40 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50  1].pBt==0 && !pP
18b50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
18b60 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
18b70 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
18b80 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20  t flags = .     
18b90 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
18ba0 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20  _READWRITE |.   
18bb0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
18bc0 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
18bd0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
18be0 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
18bf0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
18c00 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
18c10 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
18c20 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
18c30 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  B;..    rc = sql
18c40 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79  ite3BtreeFactory
18c50 28 64 62 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54  (db, 0, 0, SQLIT
18c60 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
18c70 53 49 5a 45 2c 20 66 6c 61 67 73 2c 0a 20 20 20  SIZE, flags,.   
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64                &d
18ca0 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a  b->aDb[1].pBt);.
18cb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18cc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
18cd0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
18ce0 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
18cf0 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
18d00 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20  ry database ".  
18d10 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20        "file for 
18d20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72  storing temporar
18d30 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  y tables");.    
18d40 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72    pParse->rc = r
18d50 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  c;.      return 
18d60 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
18d70 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21 64 62   db->flags & !db
18d80 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a  ->autoCommit ){.
18d90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18da0 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
18db0 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  s(db->aDb[1].pBt
18dc0 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
18dd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18de0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18df0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
18e00 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20   "unable to get 
18e10 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  a write lock on 
18e20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74 68 65  ".          "the
18e30 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
18e40 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20 20  ase file");.    
18e50 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
18e60 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 65 74   rc;.        ret
18e70 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
18e80 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
18e90 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
18ea0 65 6d 61 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ema );.  }.  ret
18eb0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
18ec0 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
18ed0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72  de that will ver
18ee0 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
18ef0 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a  ookie and start.
18f00 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  ** a read-transa
18f10 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61  ction for all na
18f20 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
18f30 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  es..**.** It is 
18f40 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
18f50 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  ll schema cookie
18f60 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e  s be verified an
18f70 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72  d all.** read tr
18f80 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74  ansactions be st
18f90 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79  arted before any
18fa0 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65  thing else happe
18fb0 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42  ns in.** the VDB
18fc0 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20  E program.  But 
18fd0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
18fe0 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
18ff0 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63   much other.** c
19000 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e  ode has been gen
19010 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65  erated.  So here
19020 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a   is what we do:.
19030 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
19040 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
19050 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20  e is called, we 
19060 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20  code an OP_Goto 
19070 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d  that.** will jum
19080 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e  p to a subroutin
19090 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
190a0 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68  the program.  Th
190b0 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20  en we.** record 
190c0 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74  every database t
190d0 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63  hat needs its sc
190e0 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e  hema verified in
190f0 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e   the.** pParse->
19100 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64  cookieMask field
19110 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20  .  Later, after 
19120 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68  all other code h
19130 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72  as been.** gener
19140 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75  ated, the subrou
19150 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74  tine that does t
19160 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
19170 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73  cations and.** s
19180 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61  tarts the transa
19190 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63  ctions will be c
191a0 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f  oded and the OP_
191b0 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a  Goto P2 value.**
191c0 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
191d0 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73   point to that s
191e0 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
191f0 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68  generation of th
19200 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69  e.** cookie veri
19210 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74  fication subrout
19220 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73  ine code happens
19230 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73   in sqlite3Finis
19240 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a  hCoding()..**.**
19250 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63   If iDb<0 then c
19260 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20  ode the OP_Goto 
19270 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74  only - don't set
19280 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20   flag to verify 
19290 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e  the.** schema on
192a0 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20   any databases. 
192b0 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
192c0 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68  d to position th
192d0 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72  e OP_Goto.** ear
192e0 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20  ly in the code, 
192f0 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69  before we know i
19300 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74  f any database t
19310 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73  ables will be us
19320 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
19330 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
19340 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
19350 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  e, int iDb){.  s
19360 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
19370 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73  be *v;.  int mas
19380 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  k;..  v = sqlite
19390 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
193a0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
193b0 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20  eturn;  /* This 
193c0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
193d0 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f  there was a prio
193e0 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20  r error */.  db 
193f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
19400 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  if( pParse->cook
19410 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20  ieGoto==0 ){.   
19420 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
19430 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oto = sqlite3Vdb
19440 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
19450 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a  o, 0, 0)+1;.  }.
19460 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a    if( iDb>=0 ){.
19470 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
19480 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61  db->nDb );.    a
19490 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
194a0 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44  Db].pBt!=0 || iD
194b0 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  b==1 );.    asse
194c0 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d  rt( iDb<SQLITE_M
194d0 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b  AX_ATTACHED+2 );
194e0 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69  .    mask = 1<<i
194f0 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61  Db;.    if( (pPa
19500 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
19510 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
19520 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
19530 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  ieMask |= mask;.
19540 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f        pParse->co
19550 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d  okieValue[iDb] =
19560 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
19570 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f  chema->schema_co
19580 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20  okie;.      if( 
19590 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
195a0 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
195b0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d    sqlite3OpenTem
195c0 70 44 61 74 61 62 61 73 65 28 70 50 61 72 73 65  pDatabase(pParse
195d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
195e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
195f0 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
19600 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66   that prepares f
19610 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72  or doing an oper
19620 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69  ation that.** mi
19630 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
19640 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
19650 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
19660 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  ts a new transac
19670 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e  tion if we are n
19680 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  ot already withi
19690 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  n.** a transacti
196a0 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  on.  If we are a
196b0 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20  lready within a 
196c0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
196d0 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  n a checkpoint.*
196e0 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  * is set if the 
196f0 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72  setStatement par
19700 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20  ameter is true. 
19710 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68   A checkpoint sh
19720 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66  ould.** be set f
19730 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68  or operations th
19740 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64  at might fail (d
19750 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69  ue to a constrai
19760 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  nt) part of.** t
19770 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61  he way through a
19780 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65  nd which will ne
19790 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20  ed to undo some 
197a0 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68  writes without h
197b0 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  aving to.** roll
197c0 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74  back the whole t
197d0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72  ransaction.  For
197e0 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72   operations wher
197f0 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
19800 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63  s.** can be chec
19810 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63  ked before any c
19820 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
19830 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
19840 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20   it is never.** 
19850 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
19860 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68  o a write and th
19870 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  e checkpoint sho
19880 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a  uld not be set..
19890 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62  **.** Only datab
198a0 61 73 65 20 69 44 62 20 61 6e 64 20 74 68 65 20  ase iDb and the 
198b0 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72  temp database ar
198c0 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20  e made writable 
198d0 62 79 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a  by this call..**
198e0 20 49 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e   If iDb==0, then
198f0 20 74 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65   the main and te
19900 6d 70 20 64 61 74 61 62 61 73 65 73 20 61 72 65  mp databases are
19910 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20   made writable. 
19920 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74    If.** iDb==1 t
19930 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d  hen only the tem
19940 70 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 61  p database is ma
19950 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66  de writable.  If
19960 20 69 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a   iDb>1 then the.
19970 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61 75 78  ** specified aux
19980 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
19990 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74  and the temp dat
199a0 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77  abase are made w
199b0 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  ritable..*/.void
199c0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
199d0 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
199e0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
199f0 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74  etStatement, int
19a00 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
19a10 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
19a20 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
19a30 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
19a40 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
19a50 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
19a60 2c 20 69 44 62 29 3b 0a 20 20 70 50 61 72 73 65  , iDb);.  pParse
19a70 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31  ->writeMask |= 1
19a80 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20 73 65 74  <<iDb;.  if( set
19a90 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 50 61  Statement && pPa
19aa0 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29  rse->nested==0 )
19ab0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
19ac0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61  eAddOp(v, OP_Sta
19ad0 74 65 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b  tement, iDb, 0);
19ae0 0a 20 20 7d 0a 20 20 69 66 28 20 28 4f 4d 49 54  .  }.  if( (OMIT
19af0 5f 54 45 4d 50 44 42 20 7c 7c 20 69 44 62 21 3d  _TEMPDB || iDb!=
19b00 31 29 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62  1) && pParse->db
19b10 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20  ->aDb[1].pBt!=0 
19b20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
19b30 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
19b40 6e 28 70 50 61 72 73 65 2c 20 73 65 74 53 74 61  n(pParse, setSta
19b50 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a  tement, 1);.  }.
19b60 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
19b70 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20  o see if pIndex 
19b80 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  uses the collati
19b90 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
19ba0 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  l.  Return.** tr
19bb0 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e  ue if it does an
19bc0 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f  d false if it do
19bd0 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64  es not..*/.#ifnd
19be0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
19bf0 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e  EINDEX.static in
19c00 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  t collationMatch
19c10 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f  (const char *zCo
19c20 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ll, Index *pInde
19c30 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  x){.  int i;.  f
19c40 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78  or(i=0; i<pIndex
19c50 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
19c60 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
19c70 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  *z = pIndex->azC
19c80 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  oll[i];.    if( 
19c90 7a 3d 3d 7a 43 6f 6c 6c 20 7c 7c 20 28 7a 20 26  z==zColl || (z &
19ca0 26 20 7a 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71  & zColl && 0==sq
19cb0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
19cc0 7a 43 6f 6c 6c 29 29 20 29 7b 0a 20 20 20 20 20  zColl)) ){.     
19cd0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
19ce0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
19cf0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19d00 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
19d10 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74  ndices of pTab t
19d20 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  hat use the coll
19d30 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
19d40 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c  Coll..** If pCol
19d50 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
19d60 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
19d70 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e  of pTab..*/.#ifn
19d80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19d90 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
19da0 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65  oid reindexTable
19db0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19dc0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61  Table *pTab, cha
19dd0 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
19de0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
19df0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
19e00 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
19e10 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
19e20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78  */..  for(pIndex
19e30 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
19e40 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49  Index; pIndex=pI
19e50 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ndex->pNext){.  
19e60 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c    if( zColl==0 |
19e70 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  | collationMatch
19e80 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20  (zColl, pIndex) 
19e90 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  ){.      int iDb
19ea0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
19eb0 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
19ec0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
19ed0 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
19ee0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
19ef0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
19f00 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
19f10 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
19f20 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
19f30 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
19f40 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
19f50 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
19f60 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ces of all table
19f70 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
19f80 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  es where the.** 
19f90 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20  indices use the 
19fa0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
19fb0 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43  ce pColl.  If pC
19fc0 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
19fd0 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64  mpute.** all ind
19fe0 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e  ices everywhere.
19ff0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1a000 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
1a010 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
1a020 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72  dexDatabases(Par
1a030 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72  se *pParse, char
1a040 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
1a050 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
1a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a070 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   A single databa
1a080 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0a0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1a0b0 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
1a0c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1a0d0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1a0e0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1a0f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1a100 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20    HashElem *k;  
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a120 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1a130 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20  r tables in pDb 
1a140 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1a150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a160 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
1a170 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a  he database */..
1a180 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62    for(iDb=0, pDb
1a190 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62  =db->aDb; iDb<db
1a1a0 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44  ->nDb; iDb++, pD
1a1b0 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  b++){.    assert
1a1c0 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20  ( pDb!=0 );.    
1a1d0 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68  for(k=sqliteHash
1a1e0 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68  First(&pDb->pSch
1a1f0 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20  ema->tblHash);  
1a200 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e  k; k=sqliteHashN
1a210 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70  ext(k)){.      p
1a220 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  Tab = (Table*)sq
1a230 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b  liteHashData(k);
1a240 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61  .      reindexTa
1a250 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
1a260 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , zColl);.    }.
1a270 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
1a280 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1a290 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45  e for the REINDE
1a2a0 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
1a2b0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2d0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a             -- 1.
1a2e0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
1a2f0 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20  X  <collation>  
1a300 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
1a310 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  2.**        REIN
1a320 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
1a330 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d  .?<tablename>  -
1a340 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 3.**        RE
1a350 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
1a360 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20  e>.?<indexname> 
1a370 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 4.**.** Form
1a380 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
1a390 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
1a3a0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
1a3b0 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a  to be rebuilt..*
1a3c0 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64  * Form 2 rebuild
1a3d0 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
1a3e0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74   all databases t
1a3f0 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65  hat use the name
1a400 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66  d.** collating f
1a410 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20  unction.  Forms 
1a420 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20  3 and 4 rebuild 
1a430 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
1a440 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65  or all.** indice
1a450 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1a460 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  h the named tabl
1a470 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
1a480 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
1a490 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  X.void sqlite3Re
1a4a0 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  index(Parse *pPa
1a4b0 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
1a4c0 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  e1, Token *pName
1a4d0 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  2){.  CollSeq *p
1a4e0 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
1a4f0 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
1a500 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65  equence to be re
1a510 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c  indexed, or NULL
1a520 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
1a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a540 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74    /* Name of a t
1a550 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
1a560 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a570 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db;            /
1a580 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
1a590 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c  tabase */.  Tabl
1a5a0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
1a5b0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
1a5c0 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
1a5d0 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
1a5e0 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
1a5f0 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
1a600 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1a610 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44  pTab */.  int iD
1a620 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1a630 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1a640 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
1a650 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
1a660 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1a670 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
1a680 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1a690 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e  /.  Token *pObjN
1a6a0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1a6b0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
1a6c0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
1a6d0 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f   be reindexed */
1a6e0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
1a6f0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
1a700 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1a710 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
1a720 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
1a730 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
1a740 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
1a750 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
1a760 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1a770 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
1a780 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
1a790 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61  ;.  }..  if( pNa
1a7a0 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 31  me1==0 || pName1
1a7b0 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ->z==0 ){.    re
1a7c0 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
1a7d0 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72  Parse, 0);.    r
1a7e0 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
1a7f0 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20  f( pName2==0 || 
1a800 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a  pName2->z==0 ){.
1a810 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
1a820 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 70 43 6f  e1->z );.    pCo
1a830 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
1a840 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
1a850 64 62 29 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d  db), (char*)pNam
1a860 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e  e1->z, pName1->n
1a870 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , 0);.    if( pC
1a880 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 61  oll ){.      cha
1a890 72 20 2a 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  r *zColl = sqlit
1a8a0 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
1a8b0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4e  (const char *)pN
1a8c0 61 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d  ame1->z, pName1-
1a8d0 3e 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  >n);.      if( z
1a8e0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
1a8f0 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
1a900 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
1a910 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a920 5f 66 72 65 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20  _free(zColl);.  
1a930 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1a940 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
1a950 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
1a960 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
1a970 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
1a980 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69   &pObjName);.  i
1a990 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
1a9a0 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  n;.  z = sqlite3
1a9b0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1a9c0 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69  , pObjName);.  i
1a9d0 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
1a9e0 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  zDb = db->aD
1a9f0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
1aa00 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
1aa10 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a  ndTable(db, z, z
1aa20 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20  Db);.  if( pTab 
1aa30 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61  ){.    reindexTa
1aa40 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
1aa50 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1aa60 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 72  3_free(z);.    r
1aa70 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e  eturn;.  }.  pIn
1aa80 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
1aa90 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44  dIndex(db, z, zD
1aaa0 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  b);.  sqlite3_fr
1aab0 65 65 28 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e  ee(z);.  if( pIn
1aac0 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
1aad0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1aae0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
1aaf0 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
1ab00 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
1ab10 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
1ab20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1ab30 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
1ab40 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
1ab50 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79  able to identify
1ab60 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62   the object to b
1ab70 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d  e reindexed");.}
1ab80 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
1ab90 65 74 75 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c  eturn a dynamicl
1aba0 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49  y allocated KeyI
1abb0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
1abc0 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a  at can be used.*
1abd0 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65  * with OP_OpenRe
1abe0 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69  ad or OP_OpenWri
1abf0 74 65 20 74 6f 20 61 63 63 65 73 73 20 64 61 74  te to access dat
1ac00 61 62 61 73 65 20 69 6e 64 65 78 20 70 49 64 78  abase index pIdx
1ac10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
1ac20 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72  ssful, a pointer
1ac30 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 72 75   to the new stru
1ac40 63 74 75 72 65 20 69 73 20 72 65 74 75 72 6e 65  cture is returne
1ac50 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a  d. In this case.
1ac60 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  ** the caller is
1ac70 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1ac80 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
1ac90 5f 66 72 65 65 28 29 20 6f 6e 20 74 68 65 20 72  _free() on the r
1aca0 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e  eturned .** poin
1acb0 74 65 72 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ter. If an error
1acc0 20 6f 63 63 75 72 73 20 28 6f 75 74 20 6f 66 20   occurs (out of 
1acd0 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e  memory or missin
1ace0 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20  g collation .** 
1acf0 73 65 71 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20  sequence), NULL 
1ad00 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1ad10 74 68 65 20 73 74 61 74 65 20 6f 66 20 70 50 61  the state of pPa
1ad20 72 73 65 20 75 70 64 61 74 65 64 20 74 6f 20 72  rse updated to r
1ad30 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65 20 65 72  eflect.** the er
1ad40 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ror..*/.KeyInfo 
1ad50 2a 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  *sqlite3IndexKey
1ad60 69 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  info(Parse *pPar
1ad70 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
1ad80 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1ad90 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
1ada0 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79  olumn;.  int nBy
1adb0 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79  tes = sizeof(Key
1adc0 49 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29  Info) + (nCol-1)
1add0 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
1ade0 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20 4b 65 79 49  ) + nCol;.  KeyI
1adf0 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65 79  nfo *pKey = (Key
1ae00 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 33 44 62  Info *)sqlite3Db
1ae10 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
1ae20 65 2d 3e 64 62 2c 20 6e 42 79 74 65 73 29 3b 0a  e->db, nBytes);.
1ae30 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
1ae40 20 20 20 70 4b 65 79 2d 3e 64 62 20 3d 20 70 50     pKey->db = pP
1ae50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 4b  arse->db;.    pK
1ae60 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  ey->aSortOrder =
1ae70 20 28 75 38 20 2a 29 26 28 70 4b 65 79 2d 3e 61   (u8 *)&(pKey->a
1ae80 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20  Coll[nCol]);.   
1ae90 20 61 73 73 65 72 74 28 20 26 70 4b 65 79 2d 3e   assert( &pKey->
1aea0 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d  aSortOrder[nCol]
1aeb0 3d 3d 26 28 28 28 75 38 20 2a 29 70 4b 65 79 29  ==&(((u8 *)pKey)
1aec0 5b 6e 42 79 74 65 73 5d 29 20 29 3b 0a 20 20 20  [nBytes]) );.   
1aed0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
1aee0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; i++){.      ch
1aef0 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78  ar *zColl = pIdx
1af00 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
1af10 20 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c     assert( zColl
1af20 20 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e   );.      pKey->
1af30 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74  aColl[i] = sqlit
1af40 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
1af50 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d  pParse, zColl, -
1af60 31 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  1);.      pKey->
1af70 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1af80 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
1af90 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  [i];.    }.    p
1afa0 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43  Key->nField = nC
1afb0 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  ol;.  }..  if( p
1afc0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
1afd0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1afe0 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b 65 79 20  pKey);.    pKey 
1aff0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1b000 6e 20 70 4b 65 79 3b 0a 7d 0a                    n pKey;.}.