/ Hex Artifact Content
Login

Artifact a89e901ea24d8ec845286f9a1fbfd14572a7777e:


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 35 30 33 20 32 30 30 38 2f 31 31 2f 31 37  1.503 2008/11/17
02f0: 20 31 39 3a 31 38 3a 35 35 20 64 61 6e 69 65 6c   19:18:55 daniel
0300: 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23  k1977 Exp $.*/.#
0310: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0320: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0330: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0340: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0350: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  called when a ne
0360: 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  w SQL statement 
0370: 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  is beginning to.
0380: 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20 20 49  ** be parsed.  I
0390: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 50  nitialize the pP
03a0: 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20 61  arse structure a
03b0: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69  s needed..*/.voi
03c0: 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61  d sqlite3BeginPa
03d0: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
03e0: 65 2c 20 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c  e, int explainFl
03f0: 61 67 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 65  ag){.  pParse->e
0400: 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69 6e  xplain = explain
0410: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
0420: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
0430: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0440: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0450: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0460: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0470: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0480: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0490: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
04a0: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
04b0: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
04c0: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
04d0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
04e0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04f0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
0500: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
0510: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
0520: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
0530: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
0540: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0550: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0560: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0570: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0580: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0590: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
05a0: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
05b0: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
05c0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
05d0: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
05e0: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05f0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
0600: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
0610: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
0620: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
0630: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
0640: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0650: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0660: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0670: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0680: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0690: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
06a0: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
06b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
06c0: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
06d0: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
06e0: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06f0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
0700: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
0710: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
0720: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
0730: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
0740: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0750: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0760: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0770: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0780: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0790: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
07a0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
07b0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
07c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
07d0: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
07e0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07f0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
0800: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
0810: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
0820: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
0830: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
0840: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0850: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0860: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0870: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0880: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0890: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
08a0: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
08b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
08c0: 20 20 69 6e 74 20 6e 42 79 74 65 73 3b 0a 20 20    int nBytes;.  
08d0: 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b 0a 0a 20  TableLock *p;.. 
08e0: 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20   if( iDb<0 ){.  
08f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
0900: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
0910: 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20  se->nTableLock; 
0920: 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  i++){.    p = &p
0930: 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63  Parse->aTableLoc
0940: 6b 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d  k[i];.    if( p-
0950: 3e 69 44 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e  >iDb==iDb && p->
0960: 69 54 61 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20  iTab==iTab ){.  
0970: 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f      p->isWriteLo
0980: 63 6b 20 3d 20 28 70 2d 3e 69 73 57 72 69 74 65  ck = (p->isWrite
0990: 4c 6f 63 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c  Lock || isWriteL
09a0: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ock);.      retu
09b0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rn;.    }.  }.. 
09c0: 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66   nBytes = sizeof
09d0: 28 54 61 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70  (TableLock) * (p
09e0: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
09f0: 6b 2b 31 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  k+1);.  pParse->
0a00: 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 20 0a 20 20  aTableLock = .  
0a10: 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61      sqlite3DbRea
0a20: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73  llocOrFree(pPars
0a30: 65 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61  e->db, pParse->a
0a40: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
0a50: 73 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  s);.  if( pParse
0a60: 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 29 7b 0a  ->aTableLock ){.
0a70: 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d      p = &pParse-
0a80: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 70 50 61 72  >aTableLock[pPar
0a90: 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b 2b  se->nTableLock++
0aa0: 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d 20  ];.    p->iDb = 
0ab0: 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62  iDb;.    p->iTab
0ac0: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e   = iTab;.    p->
0ad0: 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69 73  isWriteLock = is
0ae0: 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20 70  WriteLock;.    p
0af0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
0b00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
0b10: 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  arse->nTableLock
0b20: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65   = 0;.    pParse
0b30: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
0b40: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
0b50: 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
0b60: 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74 72 75  TableLock instru
0b70: 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74  ction for each t
0b80: 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79 20 74  able locked by t
0b90: 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  he.** statement 
0ba0: 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 63  (configured by c
0bb0: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 54  alls to sqlite3T
0bc0: 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a 2f 0a  ableLock())..*/.
0bd0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
0be0: 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72 73 65  TableLocks(Parse
0bf0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
0c00: 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56 64 62   i;.  Vdbe *pVdb
0c10: 65 3b 20 0a 0a 20 20 69 66 28 20 30 3d 3d 28 70  e; ..  if( 0==(p
0c20: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Vdbe = sqlite3Ge
0c30: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 20 29  tVdbe(pParse)) )
0c40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
0c50: 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
0c60: 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f  pParse->nTableLo
0c70: 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61  ck; i++){.    Ta
0c80: 62 6c 65 4c 6f 63 6b 20 2a 70 20 3d 20 26 70 50  bleLock *p = &pP
0c90: 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b  arse->aTableLock
0ca0: 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 70 31 20  [i];.    int p1 
0cb0: 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 20 20 73 71  = p->iDb;.    sq
0cc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
0cd0: 70 56 64 62 65 2c 20 4f 50 5f 54 61 62 6c 65 4c  pVdbe, OP_TableL
0ce0: 6f 63 6b 2c 20 70 31 2c 20 70 2d 3e 69 54 61 62  ock, p1, p->iTab
0cf0: 2c 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b  , p->isWriteLock
0d00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0d10: 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65          p->zName
0d20: 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
0d30: 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66  }.}.#else.  #def
0d40: 69 6e 65 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  ine codeTableLoc
0d50: 6b 73 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ks(x).#endif../*
0d60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
0d70: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
0d80: 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74   a single SQL st
0d90: 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e  atement has been
0da0: 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 61  .** parsed and a
0db0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 74 6f   VDBE program to
0dc0: 20 65 78 65 63 75 74 65 20 74 68 61 74 20 73 74   execute that st
0dd0: 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e  atement has been
0de0: 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20 20 54  .** prepared.  T
0df0: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 74 73  his routine puts
0e00: 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67 20 74   the finishing t
0e10: 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a  ouches on the.**
0e20: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 6e   VDBE program an
0e30: 64 20 72 65 73 65 74 73 20 74 68 65 20 70 50 61  d resets the pPa
0e40: 72 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f  rse structure fo
0e50: 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61  r the next.** pa
0e60: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  rse..**.** Note 
0e70: 74 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72  that if an error
0e80: 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69   occurred, it mi
0e90: 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
0ea0: 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20  that.** no VDBE 
0eb0: 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74  code was generat
0ec0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
0ed0: 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
0ee0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
0ef0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
0f00: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 64 62 20   Vdbe *v;..  db 
0f10: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
0f20: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
0f30: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
0f40: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73   if( pParse->nes
0f50: 74 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ted ) return;.  
0f60: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
0f70: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
0f80: 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61   Begin by genera
0f90: 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e  ting some termin
0fa0: 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68  ation code at th
0fb0: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a  e end of the.  *
0fc0: 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20  * vdbe program. 
0fd0: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
0fe0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
0ff0: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1000: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1010: 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a  p0(v, OP_Halt);.
1020: 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b  .    /* The cook
1030: 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73  ie mask contains
1040: 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   one bit for eac
1050: 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
1060: 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69  open..    ** (Bi
1070: 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c  t 0 is for main,
1080: 20 62 69 74 20 31 20 69 73 20 66 6f 72 20 74 65   bit 1 is for te
1090: 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  mp, and so forth
10a0: 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20 20 20  .)  Bits are.   
10b0: 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68   ** set for each
10c0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
10d0: 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74  s used.  Generat
10e0: 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20  e code to start 
10f0: 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  a.    ** transac
1100: 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65  tion on each use
1110: 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  d database and t
1120: 6f 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  o verify the sch
1130: 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a  ema cookie.    *
1140: 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64  * on each used d
1150: 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  atabase..    */.
1160: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1170: 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30 20 29 7b 0a  cookieGoto>0 ){.
1180: 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a        u32 mask;.
1190: 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
11a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11b0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 50 61 72  JumpHere(v, pPar
11c0: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31  se->cookieGoto-1
11d0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62  );.      for(iDb
11e0: 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c  =0, mask=1; iDb<
11f0: 64 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d  db->nDb; mask<<=
1200: 31 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20  1, iDb++){.     
1210: 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70     if( (mask & p
1220: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
1230: 6b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  k)==0 ) continue
1240: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1250: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
1260: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
1270: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1280: 32 28 76 2c 4f 50 5f 54 72 61 6e 73 61 63 74 69  2(v,OP_Transacti
1290: 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20 26  on, iDb, (mask &
12a0: 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61   pParse->writeMa
12b0: 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  sk)!=0);.       
12c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12d0: 70 32 28 76 2c 4f 50 5f 56 65 72 69 66 79 43 6f  p2(v,OP_VerifyCo
12e0: 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72 73  okie, iDb, pPars
12f0: 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  e->cookieValue[i
1300: 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69  Db]);.      }.#i
1310: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1320: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1330: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69       {.        i
1340: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
1350: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
1360: 3e 6e 56 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29  >nVtabLock; i++)
1370: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
1380: 20 2a 76 74 61 62 20 3d 20 28 63 68 61 72 20 2a   *vtab = (char *
1390: 29 70 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c  )pParse->apVtabL
13a0: 6f 63 6b 5b 69 5d 2d 3e 70 56 74 61 62 3b 0a 20  ock[i]->pVtab;. 
13b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13c0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
13d0: 5f 56 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30  _VBegin, 0, 0, 0
13e0: 2c 20 76 74 61 62 2c 20 50 34 5f 56 54 41 42 29  , vtab, P4_VTAB)
13f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1400: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74 61      pParse->nVta
1410: 62 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20  bLock = 0;.     
1420: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
1430: 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20 74 68 65   /* Once all the
1440: 20 63 6f 6f 6b 69 65 73 20 68 61 76 65 20 62 65   cookies have be
1450: 65 6e 20 76 65 72 69 66 69 65 64 20 61 6e 64 20  en verified and 
1460: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
1470: 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f  ned, .      ** o
1480: 62 74 61 69 6e 20 74 68 65 20 72 65 71 75 69 72  btain the requir
1490: 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20  ed table-locks. 
14a0: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
14b0: 75 6e 6c 65 73 73 20 74 68 65 20 0a 20 20 20 20  unless the .    
14c0: 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68    ** shared-cach
14d0: 65 20 66 65 61 74 75 72 65 20 69 73 20 65 6e 61  e feature is ena
14e0: 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bled..      */. 
14f0: 20 20 20 20 20 63 6f 64 65 54 61 62 6c 65 4c 6f       codeTableLo
1500: 63 6b 73 28 70 50 61 72 73 65 29 3b 0a 20 20 20  cks(pParse);.   
1510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1520: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1530: 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b   0, pParse->cook
1540: 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ieGoto);.    }..
1550: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1560: 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66  MIT_TRACE.    if
1570: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
1580: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 61   ){.      /* Cha
1590: 6e 67 65 20 74 68 65 20 50 34 20 61 72 67 75 6d  nge the P4 argum
15a0: 65 6e 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  ent of the first
15b0: 20 6f 70 63 6f 64 65 20 28 77 68 69 63 68 20 77   opcode (which w
15c0: 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 0a 20 20  ill always be.  
15d0: 20 20 20 20 2a 2a 20 61 6e 20 4f 50 5f 54 72 61      ** an OP_Tra
15e0: 63 65 29 20 74 6f 20 62 65 20 74 68 65 20 63 6f  ce) to be the co
15f0: 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
1600: 68 65 20 63 75 72 72 65 6e 74 20 53 51 4c 20 73  he current SQL s
1610: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
1620: 2a 2f 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  */.      VdbeOp 
1630: 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  *pOp = sqlite3Vd
1640: 62 65 47 65 74 4f 70 28 76 2c 20 30 29 3b 0a 20  beGetOp(v, 0);. 
1650: 20 20 20 20 20 69 66 28 20 70 4f 70 20 26 26 20       if( pOp && 
1660: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
1670: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
1680: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1690: 67 65 50 34 28 76 2c 20 30 2c 20 70 50 61 72 73  geP4(v, 0, pPars
16a0: 65 2d 3e 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d  e->zSql, pParse-
16b0: 3e 7a 54 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a  >zTail-pParse->z
16c0: 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sql);.      }.  
16d0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
16e0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
16f0: 2a 2f 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65  */.  }...  /* Ge
1700: 74 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  t the VDBE progr
1710: 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78 65  am ready for exe
1720: 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66  cution.  */.  if
1730: 28 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ( v && pParse->n
1740: 45 72 72 3d 3d 30 20 26 26 20 21 64 62 2d 3e 6d  Err==0 && !db->m
1750: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 23  allocFailed ){.#
1760: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1770: 55 47 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61  UG.    FILE *tra
1780: 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  ce = (db->flags 
1790: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61  & SQLITE_VdbeTra
17a0: 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20  ce)!=0 ? stdout 
17b0: 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  : 0;.    sqlite3
17c0: 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72 61  VdbeTrace(v, tra
17d0: 63 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ce);.#endif.    
17e0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
17f0: 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d  disableColCache=
1800: 3d 30 20 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c  =0 );  /* Disabl
1810: 65 73 20 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65  es and re-enable
1820: 73 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 73  s match */.    s
1830: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
1840: 61 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e  ady(v, pParse->n
1850: 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  Var, pParse->nMe
1860: 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20  m+3,.           
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1880: 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c 20 70 50  arse->nTab+3, pP
1890: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a  arse->explain);.
18a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
18b0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
18c0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
18d0: 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  esSet = 0;.  }el
18e0: 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72  se if( pParse->r
18f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1900: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1910: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1920: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61   }.  pParse->nTa
1930: 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  b = 0;.  pParse-
1940: 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61  >nMem = 0;.  pPa
1950: 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20  rse->nSet = 0;. 
1960: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
1970: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f  0;.  pParse->coo
1980: 6b 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70  kieMask = 0;.  p
1990: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
19a0: 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  o = 0;.}../*.** 
19b0: 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61  Run the parser a
19c0: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  nd code generato
19d0: 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e  r recursively in
19e0: 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61   order to genera
19f0: 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74  te.** code for t
1a00: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
1a10: 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20   given onto the 
1a20: 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73  end of the pPars
1a30: 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72  e context.** cur
1a40: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
1a50: 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e  struction.  When
1a60: 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72   the parser is r
1a70: 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a  un recursively.*
1a80: 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20  * this way, the 
1a90: 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73  final OP_Halt is
1aa0: 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e   not appended an
1ab0: 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69  d other initiali
1ac0: 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69  zation.** and fi
1ad0: 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73  nalization steps
1ae0: 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63   are omitted bec
1af0: 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68  ause those are h
1b00: 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a  andling by the.*
1b10: 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73  * outermost pars
1b20: 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76  er..**.** Not ev
1b30: 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74  erything is nest
1b40: 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69  able.  This faci
1b50: 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64  lity is designed
1b60: 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e   to permit.** IN
1b70: 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e  SERT, UPDATE, an
1b80: 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  d DELETE operati
1b90: 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49  ons against SQLI
1ba0: 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a  TE_MASTER.  Use.
1bb0: 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64  ** care if you d
1bc0: 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20  ecide to try to 
1bd0: 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
1be0: 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
1bf0: 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69  purposes..*/.voi
1c00: 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50  d sqlite3NestedP
1c10: 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  arse(Parse *pPar
1c20: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
1c30: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
1c40: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
1c50: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61  har *zSql;.  cha
1c60: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
1c70: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1c80: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65  pParse->db;.# de
1c90: 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73  fine SAVE_SZ  (s
1ca0: 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f  izeof(Parse) - o
1cb0: 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56  ffsetof(Parse,nV
1cc0: 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65  ar)).  char save
1cd0: 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20  Buf[SAVE_SZ];.. 
1ce0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1cf0: 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  r ) return;.  as
1d00: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65  sert( pParse->ne
1d10: 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e  sted<10 );  /* N
1d20: 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e  esting should on
1d30: 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64  ly be of limited
1d40: 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73   depth */.  va_s
1d50: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
1d60: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
1d70: 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20  te3VMPrintf(db, 
1d80: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
1d90: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
1da0: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
1db0: 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20   return;   /* A 
1dc0: 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  malloc must have
1dd0: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
1de0: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b   pParse->nested+
1df0: 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65  +;.  memcpy(save
1e00: 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56  Buf, &pParse->nV
1e10: 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20  ar, SAVE_SZ);.  
1e20: 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e  memset(&pParse->
1e30: 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a  nVar, 0, SAVE_SZ
1e40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50  );.  sqlite3RunP
1e50: 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53  arser(pParse, zS
1e60: 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ql, &zErrMsg);. 
1e70: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1e80: 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  b, zErrMsg);.  s
1e90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1ea0: 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79   zSql);.  memcpy
1eb0: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
1ec0: 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a  saveBuf, SAVE_SZ
1ed0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
1ee0: 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ted--;.}../*.** 
1ef0: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
1f00: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
1f10: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
1f20: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
1f30: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
1f40: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
1f50: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
1f60: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
1f70: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
1f80: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
1f90: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
1fa0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
1fb0: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
1fc0: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
1fd0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
1fe0: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
1ff0: 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68  the table and th
2000: 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68  e.** first match
2010: 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74  ing table is ret
2020: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
2030: 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61  king for duplica
2040: 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  te table.** name
2050: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
2060: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
2070: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
2080: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
2090: 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61  .** auxiliary da
20a0: 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73  tabases added us
20b0: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
20c0: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  ommand..**.** Se
20d0: 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f  e also sqlite3Lo
20e0: 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a  cateTable()..*/.
20f0: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69  Table *sqlite3Fi
2100: 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  ndTable(sqlite3 
2110: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
2120: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
2130: 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a  ar *zDatabase){.
2140: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a    Table *p = 0;.
2150: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
2160: 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Name;.  assert( 
2170: 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 6e 4e  zName!=0 );.  nN
2180: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
2190: 6c 65 6e 28 64 62 2c 20 7a 4e 61 6d 65 29 20 2b  len(db, zName) +
21a0: 20 31 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54   1;.  for(i=OMIT
21b0: 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e  _TEMPDB; i<db->n
21c0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
21d0: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
21e0: 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72  1 : i;   /* Sear
21f0: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
2200: 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  AIN */.    if( z
2210: 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73  Database!=0 && s
2220: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
2230: 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62  atabase, db->aDb
2240: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
2250: 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73  tinue;.    p = s
2260: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
2270: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
2280: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61  ma->tblHash, zNa
2290: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
22a0: 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20  if( p ) break;. 
22b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
22c0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
22d0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
22e0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
22f0: 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c  ribes a particul
2300: 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ar database.** t
2310: 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e  able given the n
2320: 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c  ame of that tabl
2330: 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c  e and (optionall
2340: 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  y) the name of t
2350: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
2360: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
2370: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ble.  Return NUL
2380: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20  L if not found. 
2390: 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a   Also leave an.*
23a0: 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * error message 
23b0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
23c0: 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  sg..**.** The di
23d0: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
23e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
23f0: 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  d sqlite3FindTab
2400: 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  le() is that thi
2410: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61  s.** routine lea
2420: 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ves an error mes
2430: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
2440: 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a  zErrMsg where.**
2450: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
2460: 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f  e() does not..*/
2470: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
2480: 6f 63 61 74 65 54 61 62 6c 65 28 0a 20 20 50 61  ocateTable(.  Pa
2490: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
24a0: 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20       /* context 
24b0: 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65 70 6f  in which to repo
24c0: 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  rt errors */.  i
24d0: 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20  nt isView,      
24e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
24f0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 56   looking for a V
2500: 49 45 57 20 72 61 74 68 65 72 20 74 68 61 6e 20  IEW rather than 
2510: 61 20 54 41 42 4c 45 20 2a 2f 0a 20 20 63 6f 6e  a TABLE */.  con
2520: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
2530: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2540: 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
2550: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20  looking for */. 
2560: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2570: 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ase     /* Name 
2580: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
2590: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
25a0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
25b0: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
25c0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
25d0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
25e0: 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
25f0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
2600: 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
2610: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
2620: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
2630: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
2640: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
2650: 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
2660: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20  n 0;.  }..  p = 
2670: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2680: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
2690: 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69  me, zDbase);.  i
26a0: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63  f( p==0 ){.    c
26b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20  onst char *zMsg 
26c0: 3d 20 69 73 56 69 65 77 20 3f 20 22 6e 6f 20 73  = isView ? "no s
26d0: 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e 6f 20  uch view" : "no 
26e0: 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 20 20 20  such table";.   
26f0: 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20   if( zDbase ){. 
2700: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2710: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
2720: 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67 2c 20  : %s.%s", zMsg, 
2730: 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a  zDbase, zName);.
2740: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2750: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2760: 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73  (pParse, "%s: %s
2770: 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b  ", zMsg, zName);
2780: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
2790: 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
27a0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
27b0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   p;.}../*.** Loc
27c0: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
27d0: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
27e0: 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61   describes .** a
27f0: 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
2800: 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  x given the name
2810: 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a   of that index.*
2820: 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f  * and the name o
2830: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
2840: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
2850: 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72   index..** Retur
2860: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
2870: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
2880: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
2890: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
28a0: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
28b0: 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68  .** table and th
28c0: 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
28d0: 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e   index is return
28e0: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
28f0: 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61  g.** for duplica
2900: 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69  te index names i
2910: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
2920: 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a  arch order is.**
2930: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
2940: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
2950: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
2960: 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73  ases added.** us
2970: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
2980: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78  ommand..*/.Index
2990: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64   *sqlite3FindInd
29a0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
29b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
29c0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
29d0: 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  Db){.  Index *p 
29e0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
29f0: 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  int nName = sqli
2a00: 74 65 33 53 74 72 6c 65 6e 28 64 62 2c 20 7a 4e  te3Strlen(db, zN
2a10: 61 6d 65 29 2b 31 3b 0a 20 20 66 6f 72 28 69 3d  ame)+1;.  for(i=
2a20: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
2a30: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2a40: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
2a50: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
2a60: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
2a70: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63  e MAIN */.    Sc
2a80: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
2a90: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
2aa0: 6d 61 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20  ma;.    if( zDb 
2ab0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2ac0: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
2ad0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2ae0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
2af0: 20 70 53 63 68 65 6d 61 20 7c 7c 20 28 6a 3d 3d   pSchema || (j==
2b00: 31 20 26 26 20 21 64 62 2d 3e 61 44 62 5b 31 5d  1 && !db->aDb[1]
2b10: 2e 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28  .pBt) );.    if(
2b20: 20 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   pSchema ){.    
2b30: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
2b40: 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e  hFind(&pSchema->
2b50: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  idxHash, zName, 
2b60: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nName);.    }.  
2b70: 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b    if( p ) break;
2b80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
2b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69  .}../*.** Reclai
2ba0: 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65  m the memory use
2bb0: 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f  d by an index.*/
2bc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
2bd0: 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29  eIndex(Index *p)
2be0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
2bf0: 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 64 62 3b  = p->pTable->db;
2c00: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2c10: 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29  (db, p->zColAff)
2c20: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2c30: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
2c40: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
2c50: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
2c60: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
2c70: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
2c80: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
2c90: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
2ca0: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
2cb0: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
2cc0: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  base hash tables
2cd0: 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f   but.** it is no
2ce0: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
2cf0: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
2d00: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e  t indexes..** Un
2d10: 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65  linking from the
2d20: 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64   Table must be d
2d30: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
2d40: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
2d50: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2d60: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 49 6e  teDeleteIndex(In
2d70: 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78  dex *p){.  Index
2d80: 20 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e 73 74 20   *pOld;.  const 
2d90: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d  char *zName = p-
2da0: 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f 6c 64 20  >zName;..  pOld 
2db0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
2dc0: 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d  ert(&p->pSchema-
2dd0: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
2de0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
2df0: 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
2e00: 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d  pOld==0 || pOld=
2e10: 3d 70 20 29 3b 0a 20 20 66 72 65 65 49 6e 64 65  =p );.  freeInde
2e20: 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  x(p);.}../*.** F
2e30: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
2e40: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
2e50: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
2e60: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
2e70: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
2e80: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
2e90: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
2ea0: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
2eb0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
2ec0: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
2ed0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
2ee0: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
2ef0: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
2f00: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
2f10: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
2f20: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
2f30: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
2f40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
2f50: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
2f60: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e  Index;.  int len
2f70: 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 20  ;.  Hash *pHash 
2f80: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  = &db->aDb[iDb].
2f90: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
2fa0: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  ;..  len = sqlit
2fb0: 65 33 53 74 72 6c 65 6e 28 64 62 2c 20 7a 49 64  e3Strlen(db, zId
2fc0: 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78  xName);.  pIndex
2fd0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
2fe0: 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78  sert(pHash, zIdx
2ff0: 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c 20 30 29 3b  Name, len+1, 0);
3000: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
3010: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
3020: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d  >pTable->pIndex=
3030: 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20  =pIndex ){.     
3040: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
3050: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
3060: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
3070: 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
3080: 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  *p;.      for(p=
3090: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
30a0: 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d 3e  pIndex; p && p->
30b0: 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20 70  pNext!=pIndex; p
30c0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20  =p->pNext){}.   
30d0: 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70     if( p && p->p
30e0: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  Next==pIndex ){.
30f0: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
3100: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
3110: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3120: 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70 49      freeIndex(pI
3130: 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  ndex);.  }.  db-
3140: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
3150: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
3160: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61  }../*.** Erase a
3170: 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d  ll schema inform
3180: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 69  ation from the i
3190: 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
31a0: 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73 69 6e  bles of.** a sin
31b0: 67 6c 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  gle database.  T
31c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
31d0: 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61 69 6d  alled to reclaim
31e0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72   memory.** befor
31f0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  e the database c
3200: 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c  loses.  It is al
3210: 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67  so called during
3220: 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69   a rollback.** i
3230: 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63 68  f there were sch
3240: 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69  ema changes duri
3250: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
3260: 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73 63  on or if a.** sc
3270: 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73 6d  hema-cookie mism
3280: 61 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  atch occurs..**.
3290: 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68 65  ** If iDb<=0 the
32a0: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
32b0: 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62 6c  rnal schema tabl
32c0: 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  es for all datab
32d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49  ase.** files.  I
32e0: 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72 65  f iDb>=2 then re
32f0: 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
3300: 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79   schema for only
3310: 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66   the.** single f
3320: 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a  ile indicated..*
3330: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
3340: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
3350: 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  a(sqlite3 *db, i
3360: 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 69  nt iDb){.  int i
3370: 2c 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 69  , j;.  assert( i
3380: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
3390: 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69  >nDb );..  if( i
33a0: 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  Db==0 ){.    sql
33b0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
33c0: 6c 28 64 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  l(db);.  }.  for
33d0: 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44  (i=iDb; i<db->nD
33e0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20  b; i++){.    Db 
33f0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
3400: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
3410: 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
3420: 20 20 61 73 73 65 72 74 28 69 3d 3d 31 20 7c 7c    assert(i==1 ||
3430: 20 28 70 44 62 2d 3e 70 42 74 20 26 26 20 73 71   (pDb->pBt && sq
3440: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
3450: 75 74 65 78 28 70 44 62 2d 3e 70 42 74 29 29 29  utex(pDb->pBt)))
3460: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
3470: 63 68 65 6d 61 46 72 65 65 28 70 44 62 2d 3e 70  chemaFree(pDb->p
3480: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
3490: 20 20 20 69 66 28 20 69 44 62 3e 30 20 29 20 72     if( iDb>0 ) r
34a0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
34b0: 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20  ert( iDb==0 );. 
34c0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
34d0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
34e0: 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ges;.  sqlite3Bt
34f0: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
3500: 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72  ..  /* If one or
3510: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78   more of the aux
3520: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
3530: 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63  files has been c
3540: 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e  losed,.  ** then
3550: 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f   remove them fro
3560: 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  m the auxiliary 
3570: 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20  database list.  
3580: 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a  We take the.  **
3590: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
35a0: 64 6f 20 74 68 69 73 20 68 65 72 65 20 73 69 6e  do this here sin
35b0: 63 65 20 77 65 20 68 61 76 65 20 6a 75 73 74 20  ce we have just 
35c0: 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74  deleted all of t
35d0: 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68  he.  ** schema h
35e0: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
35f0: 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20  herefore do not 
3600: 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79  have to make any
3610: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
3620: 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61   any of those ta
3630: 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
3640: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
3650: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
3660: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
3670: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
3680: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a   pDb->pBt==0 ){.
3690: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
36a0: 41 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72 65  Aux && pDb->xFre
36b0: 65 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72 65  eAux ) pDb->xFre
36c0: 65 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29 3b  eAux(pDb->pAux);
36d0: 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75 78  .      pDb->pAux
36e0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
36f0: 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64    for(i=j=2; i<d
3700: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3710: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
3720: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
3730: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
3740: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
3750: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3760: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
3770: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
3780: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
3790: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
37a0: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
37b0: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
37c0: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
37d0: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
37e0: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
37f0: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
3800: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
3810: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
3820: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
3830: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
3840: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
3850: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
3860: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
3870: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
3880: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
3890: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
38a0: 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62  db->aDb);.    db
38b0: 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
38c0: 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tatic;.  }.}../*
38d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
38e0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
38f0: 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e  a commit occurs.
3900: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3910: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
3920: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
3930: 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  b){.  db->flags 
3940: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
3950: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
3960: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
3970: 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 61  umn names from a
3980: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2e 0a   table or view..
3990: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
39a0: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
39b0: 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61  Names(Table *pTa
39c0: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
39d0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
39e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
39f0: 54 61 62 6c 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Table->db;.  ass
3a00: 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29  ert( pTable!=0 )
3a10: 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20  ;.  if( (pCol = 
3a20: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30  pTable->aCol)!=0
3a30: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
3a40: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
3a50: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
3a60: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
3a70: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  ee(db, pCol->zNa
3a80: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
3a90: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
3aa0: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20   pCol->pDflt);. 
3ab0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
3ac0: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79  ee(db, pCol->zTy
3ad0: 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pe);.      sqlit
3ae0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
3af0: 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  l->zColl);.    }
3b00: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
3b10: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61  ee(db, pTable->a
3b20: 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 70 54 61 62  Col);.  }.  pTab
3b30: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
3b40: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
3b50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
3b60: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74  e the memory dat
3b70: 61 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73  a structures ass
3b80: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
3b90: 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e   given.** Table.
3ba0: 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65    No changes are
3bb0: 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79   made to disk by
3bc0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
3bd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3be0: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74  e just deletes t
3bf0: 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  he data structur
3c00: 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  e.  It does not 
3c10: 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61  unlink.** the ta
3c20: 62 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ble data structu
3c30: 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  re from the hash
3c40: 20 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65   table.  Nor doe
3c50: 73 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66  s it remove.** f
3c60: 6f 72 65 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d  oreign keys from
3c70: 20 74 68 65 20 73 71 6c 69 74 65 2e 61 46 4b 65   the sqlite.aFKe
3c80: 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42  y hash table.  B
3c90: 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72  ut it does destr
3ca0: 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72  oy.** memory str
3cb0: 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69  uctures of the i
3cc0: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
3cd0: 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74  gn keys associat
3ce0: 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
3cf0: 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
3d00: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
3d10: 65 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  e(Table *pTable)
3d20: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
3d30: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65  x, *pNext;.  FKe
3d40: 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74  y *pFKey, *pNext
3d50: 46 4b 65 79 3b 0a 20 20 73 71 6c 69 74 65 33 20  FKey;.  sqlite3 
3d60: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  *db;..  if( pTab
3d70: 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  le==0 ) return;.
3d80: 20 20 64 62 20 3d 20 70 54 61 62 6c 65 2d 3e 64    db = pTable->d
3d90: 62 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  b;..  /* Do not 
3da0: 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65  delete the table
3db0: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72   until the refer
3dc0: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
3dd0: 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 70 54  es zero. */.  pT
3de0: 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  able->nRef--;.  
3df0: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  if( pTable->nRef
3e00: 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
3e10: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
3e20: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20  pTable->nRef==0 
3e30: 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  );..  /* Delete 
3e40: 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f  all indices asso
3e50: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
3e60: 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f   table.  */.  fo
3e70: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
3e80: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
3e90: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
3ea0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
3eb0: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
3ec0: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
3ed0: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65  >pSchema==pTable
3ee0: 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
3ef0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64   sqliteDeleteInd
3f00: 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  ex(pIndex);.  }.
3f10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3f20: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
3f30: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
3f40: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73   foreign keys as
3f50: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
3f60: 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b  is table.  The k
3f70: 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  eys.  ** should 
3f80: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
3f90: 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  n unlinked from 
3fa0: 74 68 65 20 70 53 63 68 65 6d 61 2d 3e 61 46 4b  the pSchema->aFK
3fb0: 65 79 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20  ey hash table . 
3fc0: 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d   */.  for(pFKey=
3fd0: 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70  pTable->pFKey; p
3fe0: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78  FKey; pFKey=pNex
3ff0: 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78  tFKey){.    pNex
4000: 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70  tFKey = pFKey->p
4010: 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73  NextFrom;.    as
4020: 73 65 72 74 28 20 73 71 6c 69 74 65 33 48 61 73  sert( sqlite3Has
4030: 68 46 69 6e 64 28 26 70 54 61 62 6c 65 2d 3e 70  hFind(&pTable->p
4040: 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 0a 20  Schema->aFKey,. 
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
4070: 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b  >zTo, strlen(pFK
4080: 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b  ey->zTo)+1)!=pFK
4090: 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ey );.    sqlite
40a0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65  3DbFree(db, pFKe
40b0: 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  y);.  }.#endif..
40c0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
40d0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
40e0: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
40f0: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
4100: 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20  Names(pTable);. 
4110: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4120: 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  b, pTable->zName
4130: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
4140: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a  ee(db, pTable->z
4150: 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74  ColAff);.  sqlit
4160: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
4170: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
4180: 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ct);.#ifndef SQL
4190: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
41a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
41b0: 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  te(db, pTable->p
41c0: 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20  Check);.#endif. 
41d0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61   sqlite3VtabClea
41e0: 72 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c  r(pTable);.  sql
41f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4200: 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Table);.}../*.**
4210: 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65   Unlink the give
4220: 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  n table from the
4230: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
4240: 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a   the delete the.
4250: 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  ** table structu
4260: 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20  re with all its 
4270: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
4280: 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69  ign keys..*/.voi
4290: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
42a0: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  ndDeleteTable(sq
42b0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
42c0: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
42d0: 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62  zTabName){.  Tab
42e0: 6c 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a 70  le *p;.  FKey *p
42f0: 46 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20 2a  F1, *pF2;.  Db *
4300: 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
4310: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
4320: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
4330: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
4340: 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 26  sert( zTabName &
4350: 26 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29 3b  & zTabName[0] );
4360: 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
4370: 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71  b[iDb];.  p = sq
4380: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
4390: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
43a0: 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65  blHash, zTabName
43b0: 2c 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61 6d  , strlen(zTabNam
43c0: 65 29 2b 31 2c 30 29 3b 0a 20 20 69 66 28 20 70  e)+1,0);.  if( p
43d0: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
43e0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
43f0: 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46 31 3d  KEY.    for(pF1=
4400: 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b 20 70  p->pFKey; pF1; p
4410: 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f  F1=pF1->pNextFro
4420: 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  m){.      int nT
4430: 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d 3e  o = strlen(pF1->
4440: 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  zTo) + 1;.      
4450: 70 46 32 20 3d 20 73 71 6c 69 74 65 33 48 61 73  pF2 = sqlite3Has
4460: 68 46 69 6e 64 28 26 70 44 62 2d 3e 70 53 63 68  hFind(&pDb->pSch
4470: 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d  ema->aFKey, pF1-
4480: 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20  >zTo, nTo);.    
4490: 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29    if( pF2==pF1 )
44a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
44b0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
44c0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79  ->pSchema->aFKey
44d0: 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c  , pF1->zTo, nTo,
44e0: 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a   pF1->pNextTo);.
44f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4500: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32 20       while( pF2 
4510: 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21  && pF2->pNextTo!
4520: 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32 2d  =pF1 ){ pF2=pF2-
4530: 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20  >pNextTo; }.    
4540: 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20      if( pF2 ){. 
4550: 20 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70 4e           pF2->pN
4560: 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65  extTo = pF1->pNe
4570: 78 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xtTo;.        }.
4580: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
4590: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
45a0: 44 65 6c 65 74 65 54 61 62 6c 65 28 70 29 3b 0a  DeleteTable(p);.
45b0: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
45c0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
45d0: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
45e0: 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c  * Given a token,
45f0: 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   return a string
4600: 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
4610: 66 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  f the text of th
4620: 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74 68  at.** token with
4630: 20 61 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73 20   any quotations 
4640: 72 65 6d 6f 76 65 64 2e 20 20 53 70 61 63 65 20  removed.  Space 
4650: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
4660: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
4670: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
4680: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
4690: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
46a0: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
46b0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ** function..**.
46c0: 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66  ** Tokens are of
46d0: 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72  ten just pointer
46e0: 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  s into the origi
46f0: 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64  nal SQL text and
4700: 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c   so.** are not \
4710: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
4720: 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69  nd are not persi
4730: 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75  stent.  The retu
4740: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
4750: 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  s \000 terminate
4760: 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74  d and is persist
4770: 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ent..*/.char *sq
4780: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
4790: 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  en(sqlite3 *db, 
47a0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
47b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
47c0: 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
47d0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
47e0: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
47f0: 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70  har*)pName->z, p
4800: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  Name->n);.    sq
4810: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
4820: 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
4830: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d    zName = 0;.  }
4840: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
4850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
4860: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
4870: 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e   table stored in
4880: 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
4890: 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74   iDb for.** writ
48a0: 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69  ing. The table i
48b0: 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63  s opened using c
48c0: 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ursor 0..*/.void
48d0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
48e0: 65 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  erTable(Parse *p
48f0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
4900: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
4910: 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c  etVdbe(p);.  sql
4920: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ite3TableLock(p,
4930: 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f   iDb, MASTER_ROO
4940: 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42  T, 1, SCHEMA_TAB
4950: 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69  LE(iDb));.  sqli
4960: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4970: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
4980: 73 2c 20 30 2c 20 35 29 3b 2f 2a 20 73 71 6c 69  s, 0, 5);/* sqli
4990: 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35 20  te_master has 5 
49a0: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 73 71 6c  columns */.  sql
49b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
49c0: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
49d0: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
49e0: 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iDb);.}../*.** T
49f0: 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  he token *pName 
4a00: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
4a10: 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  e of a database 
4a20: 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f  (either "main" o
4a30: 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74  r.** "temp" or t
4a40: 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74  he name of an at
4a50: 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73  tached db). This
4a60: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
4a70: 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66   the.** index of
4a80: 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62   the named datab
4a90: 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  ase in db->aDb[]
4aa0: 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e  , or -1 if the n
4ab0: 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73  amed db .** does
4ac0: 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69   not exist..*/.i
4ad0: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62  nt sqlite3FindDb
4ae0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
4af0: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69  ken *pName){.  i
4b00: 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 2f 2a  nt i = -1;    /*
4b10: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
4b20: 20 2a 2f 0a 20 20 73 69 7a 65 5f 74 20 6e 3b 20   */.  size_t n; 
4b30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4b40: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
4b50: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 44 62  the name */.  Db
4b60: 20 2a 70 44 62 3b 20 20 20 20 20 20 20 2f 2a 20   *pDb;       /* 
4b70: 41 20 64 61 74 61 62 61 73 65 20 77 68 6f 73 65  A database whose
4b80: 20 6e 61 6d 65 20 73 70 61 63 65 20 69 73 20 62   name space is b
4b90: 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 2a 2f  eing searched */
4ba0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
4bb0: 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65    /* Name we are
4bc0: 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a   searching for *
4bd0: 2f 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  /..  zName = sql
4be0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4bf0: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
4c00: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
4c10: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d   n = strlen(zNam
4c20: 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64  e);.    for(i=(d
4c30: 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26  b->nDb-1), pDb=&
4c40: 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30  db->aDb[i]; i>=0
4c50: 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20  ; i--, pDb--){. 
4c60: 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49 54 5f       if( (!OMIT_
4c70: 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20 29  TEMPDB || i!=1 )
4c80: 20 26 26 20 6e 3d 3d 73 74 72 6c 65 6e 28 70 44   && n==strlen(pD
4c90: 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20  b->zName) && .  
4ca0: 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74          0==sqlit
4cb0: 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a  e3StrICmp(pDb->z
4cc0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  Name, zName) ){.
4cd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4ce0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4cf0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4d00: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  b, zName);.  }. 
4d10: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
4d20: 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   The table or vi
4d30: 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61  ew or trigger na
4d40: 6d 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  me is passed to 
4d50: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
4d60: 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65   tokens.** pName
4d70: 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66  1 and pName2. If
4d80: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
4d90: 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  was fully qualif
4da0: 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ied, for example
4db0: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
4dc0: 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e  ABLE xxx.yyy (..
4dd0: 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20  .);.** .** Then 
4de0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
4df0: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
4e00: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
4e10: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a  other hand if.**
4e20: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
4e30: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
4e40: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a  lified, i.e.:.**
4e50: 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45  .** CREATE TABLE
4e60: 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a   yyy(...);.**.**
4e70: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
4e80: 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64  set to "yyy" and
4e90: 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a   pName2 is ""..*
4ea0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4eb0: 65 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e  e sets the *ppUn
4ec0: 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20  qual pointer to 
4ed0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b  point at the tok
4ee0: 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a  en (pName1 or.**
4ef0: 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74   pName2) that st
4f00: 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69  ores the unquali
4f10: 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e  fied table name.
4f20: 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74    The index of t
4f30: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22  he.** database "
4f40: 78 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64  xxx" is returned
4f50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4f60: 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50  TwoPartName(.  P
4f70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4f80: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
4f90: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
4fa0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
4fb0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
4fc0: 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20     /* The "xxx" 
4fd0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
4fe0: 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a  .yyy" or "xxx" *
4ff0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
5000: 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  2,      /* The "
5010: 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  yyy" in the name
5020: 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20   "xxx.yyy" */.  
5030: 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20  Token **pUnqual 
5040: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
5050: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a   unqualified obj
5060: 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f  ect name here */
5070: 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  .){.  int iDb;  
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5090: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
50a0: 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74  lding the object
50b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
50c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
50d0: 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26  .  if( pName2 &&
50e0: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a   pName2->n>0 ){.
50f0: 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
5100: 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20  .busy ) {.      
5110: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5120: 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74  pParse, "corrupt
5130: 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20   database");.   
5140: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
5150: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
5160: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  -1;.    }.    *p
5170: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b  Unqual = pName2;
5180: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
5190: 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61  e3FindDb(db, pNa
51a0: 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44  me1);.    if( iD
51b0: 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  b<0 ){.      sql
51c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
51d0: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  rse, "unknown da
51e0: 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d  tabase %T", pNam
51f0: 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  e1);.      pPars
5200: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
5210: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5220: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
5230: 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
5240: 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e  iDb==0 || db->in
5250: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69  it.busy );.    i
5260: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
5270: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
5280: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
5290: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
52a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
52b0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
52c0: 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20  ck if the UTF-8 
52d0: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20  string zName is 
52e0: 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61  a legal.** unqua
52f0: 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20  lified name for 
5300: 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a  a new schema obj
5310: 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65  ect (table, inde
5320: 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72  x, view or.** tr
5330: 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65  igger). All name
5340: 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65  s are legal exce
5350: 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65  pt those that be
5360: 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72  gin with the str
5370: 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22  ing.** "sqlite_"
5380: 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65   (in upper, lowe
5390: 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29  r or mixed case)
53a0: 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f  . This portion o
53b0: 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a  f the namespace.
53c0: 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66  ** is reserved f
53d0: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e  or internal use.
53e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
53f0: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50  heckObjectName(P
5400: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
5410: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
5420: 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  {.  if( !pParse-
5430: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  >db->init.busy &
5440: 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
5450: 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26  ==0 .          &
5460: 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  & (pParse->db->f
5470: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72  lags & SQLITE_Wr
5480: 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20  iteSchema)==0.  
5490: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
54a0: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
54b0: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
54c0: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
54d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
54e0: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
54f0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
5500: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
5510: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
5520: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
5530: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
5540: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
5550: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
5560: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
5570: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
5580: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
5590: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
55a0: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
55b0: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
55c0: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
55d0: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
55e0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
55f0: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
5600: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
5610: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
5620: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
5630: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
5640: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
5650: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  e table name. Th
5660: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
5670: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
5680: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
5690: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
56a0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
56b0: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
56c0: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
56d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
56e0: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
56f0: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
5700: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
5710: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
5720: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
5730: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
5740: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
5750: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
5760: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
5770: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
5780: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5790: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
57a0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
57b0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
57c0: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
57d0: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
57e0: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
57f0: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
5800: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
5810: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
5820: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
5830: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
5840: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
5850: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
5860: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
5870: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
5880: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
5890: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
58a0: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
58b0: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
58c0: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
58d0: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
58e0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
58f0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
5900: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
5910: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
5920: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
5930: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
5940: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
5950: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
5960: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
5970: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
5980: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
5990: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
59a0: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
59b0: 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20  int isView,     
59c0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
59d0: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20   is a VIEW */.  
59e0: 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20  int isVirtual,  
59f0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
5a00: 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61   is a VIRTUAL ta
5a10: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  ble */.  int noE
5a20: 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  rr        /* Do 
5a30: 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65  nothing if table
5a40: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
5a50: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
5a60: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
5a70: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65  Name = 0; /* The
5a80: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77   name of the new
5a90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
5aa0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5ab0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
5ac0: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
5ad0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
5ae0: 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65  number to create
5af0: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f   the table in */
5b00: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
5b10: 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
5b20: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  ed name of the t
5b30: 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a  able to create *
5b40: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  /..  /* The tabl
5b50: 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74  e or view name t
5b60: 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73 73  o create is pass
5b70: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
5b80: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20  ne via tokens.  
5b90: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
5ba0: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
5bb0: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
5bc0: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
5bd0: 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   example:.  **. 
5be0: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
5bf0: 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a   xxx.yyy (...);.
5c00: 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20    ** .  ** Then 
5c10: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
5c20: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
5c30: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
5c40: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20  other hand if.  
5c50: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
5c60: 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71  e is not fully q
5c70: 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a  ualified, i.e.:.
5c80: 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45    **.  ** CREATE
5c90: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
5ca0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
5cb0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
5cc0: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
5cd0: 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20  2 is ""..  **.  
5ce0: 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f  ** The call belo
5cf0: 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65  w sets the pName
5d00: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
5d10: 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28  t at the token (
5d20: 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70  pName1 or.  ** p
5d30: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
5d40: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
5d50: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  ed table name. T
5d60: 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62 20  he variable iDb 
5d70: 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74  is.  ** set to t
5d80: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
5d90: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68  database that th
5da0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
5db0: 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72  is to be.  ** cr
5dc0: 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20  eated in..  */. 
5dd0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
5de0: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
5df0: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
5e00: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  , &pName);.  if(
5e10: 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
5e20: 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d  .  if( !OMIT_TEM
5e30: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26  PDB && isTemp &&
5e40: 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a   iDb>1 ){.    /*
5e50: 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74   If creating a t
5e60: 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e  emp table, the n
5e70: 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71  ame may not be q
5e80: 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20  ualified */.    
5e90: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5ea0: 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61  pParse, "tempora
5eb0: 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75  ry table name mu
5ec0: 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65  st be unqualifie
5ed0: 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d");.    return;
5ee0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54  .  }.  if( !OMIT
5ef0: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
5f00: 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20  p ) iDb = 1;..  
5f10: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
5f20: 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a  en = *pName;.  z
5f30: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
5f40: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
5f50: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
5f60: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
5f70: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
5f80: 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
5f90: 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
5fa0: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67   zName) ){.    g
5fb0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
5fc0: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  error;.  }.  if(
5fd0: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31   db->init.iDb==1
5fe0: 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23   ) isTemp = 1;.#
5ff0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6000: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
6010: 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 54 65  .  assert( (isTe
6020: 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20  mp & 1)==isTemp 
6030: 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  );.  {.    int c
6040: 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ode;.    char *z
6050: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
6060: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
6070: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
6080: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
6090: 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
60a0: 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30  TABLE(isTemp), 0
60b0: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
60c0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
60d0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
60e0: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
60f0: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
6100: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
6110: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
6120: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
6130: 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20  _TEMP_VIEW;.    
6140: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6150: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
6160: 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20  REATE_VIEW;.    
6170: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
6180: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
6190: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
61a0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
61b0: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
61c0: 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
61d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
61e0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
61f0: 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20  REATE_TABLE;.   
6200: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
6210: 66 28 20 21 69 73 56 69 72 74 75 61 6c 20 26 26  f( !isVirtual &&
6220: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
6230: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
6240: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
6250: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
6260: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6270: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
6280: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
6290: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e   the new table n
62a0: 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c  ame does not col
62b0: 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69  lide with an exi
62c0: 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78  sting.  ** index
62d0: 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69   or table name i
62e0: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
62f0: 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65  ase.  Issue an e
6300: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a  rror message if.
6310: 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68    ** it does. Th
6320: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
6330: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
6340: 62 65 69 6e 67 20 70 61 72 73 65 64 20 77 61 73  being parsed was
6350: 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20   passed.  ** to 
6360: 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61  an sqlite3_decla
6370: 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20  re_vtab() call. 
6380: 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c  In that case onl
6390: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
63a0: 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65  es.  ** and type
63b0: 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20  s will be used, 
63c0: 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  so there is no n
63d0: 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20  eed to test for 
63e0: 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63  namespace.  ** c
63f0: 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  ollisions..  */.
6400: 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c 41 52    if( !IN_DECLAR
6410: 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 69 66  E_VTAB ){.    if
6420: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
6430: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
6440: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20  Parse) ){.      
6450: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6460: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
6470: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
6480: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
6490: 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69  zName, db->aDb[i
64a0: 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db].zName);.    
64b0: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
64c0: 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29      if( !noErr )
64d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
64e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
64f0: 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65  , "table %T alre
6500: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61  ady exists", pNa
6510: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
6520: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
6530: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
6540: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
6550: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
6560: 61 6d 65 2c 20 30 29 21 3d 30 20 26 26 20 28 69  ame, 0)!=0 && (i
6570: 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e  Db==0 || !db->in
6580: 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20  it.busy) ){.    
6590: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
65a0: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
65b0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
65c0: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
65d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
65e0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
65f0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
6600: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
6610: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
6620: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
6630: 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  ));.  if( pTable
6640: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
6650: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
6660: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
6670: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
6680: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
6690: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  ++;.    goto beg
66a0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
66b0: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e    }.  pTable->zN
66c0: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  ame = zName;.  p
66d0: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d  Table->iPKey = -
66e0: 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  1;.  pTable->pSc
66f0: 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
6700: 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70  Db].pSchema;.  p
6710: 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Table->nRef = 1;
6720: 0a 20 20 70 54 61 62 6c 65 2d 3e 64 62 20 3d 20  .  pTable->db = 
6730: 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  db;.  if( pParse
6740: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71  ->pNewTable ) sq
6750: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
6760: 28 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  (pParse->pNewTab
6770: 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  le);.  pParse->p
6780: 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  NewTable = pTabl
6790: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  e;..  /* If this
67a0: 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71   is the magic sq
67b0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
67c0: 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f  ble used by auto
67d0: 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20  increment,.  ** 
67e0: 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f  then record a po
67f0: 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61  inter to this ta
6800: 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
6810: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
6820: 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  re.  ** so that 
6830: 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20  INSERT can find 
6840: 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79  the table easily
6850: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
6860: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
6870: 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NCREMENT.  if( !
6880: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26  pParse->nested &
6890: 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  & strcmp(zName, 
68a0: 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  "sqlite_sequence
68b0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61  ")==0 ){.    pTa
68c0: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53  ble->pSchema->pS
68d0: 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a  eqTab = pTable;.
68e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
68f0: 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
6900: 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  g the code that 
6910: 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20  will insert the 
6920: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74  table record int
6930: 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54  o.  ** the SQLIT
6940: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
6950: 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75   Note in particu
6960: 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74  lar that we must
6970: 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61   go ahead.  ** a
6980: 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  nd allocate the 
6990: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
69a0: 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  r the table entr
69b0: 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61  y now.  Before a
69c0: 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20  ny.  ** PRIMARY 
69d0: 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65  KEY or UNIQUE ke
69e0: 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65  ywords are parse
69f0: 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72  d.  Those keywor
6a00: 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20  ds will cause.  
6a10: 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65  ** indices to be
6a20: 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65   created and the
6a30: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75   table record mu
6a40: 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74  st come before t
6a50: 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  he .  ** indices
6a60: 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65  .  Hence, the re
6a70: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
6a80: 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62  the table must b
6a90: 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a  e allocated.  **
6aa0: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
6ab0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
6ac0: 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47  && (v = sqlite3G
6ad0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21  etVdbe(pParse))!
6ae0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31  =0 ){.    int j1
6af0: 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f  ;.    int fileFo
6b00: 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72 65  rmat;.    int re
6b10: 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b 0a  g1, reg2, reg3;.
6b20: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
6b30: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
6b40: 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
6b50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6b60: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
6b70: 45 0a 20 20 20 20 69 66 28 20 69 73 56 69 72 74  E.    if( isVirt
6b80: 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ual ){.      sql
6b90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
6ba0: 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20  , OP_VBegin);.  
6bb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
6bc0: 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 66  /* If the file f
6bd0: 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69  ormat and encodi
6be0: 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ng in the databa
6bf0: 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e  se have not been
6c00: 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65   set, .    ** se
6c10: 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20  t them now..    
6c20: 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50  */.    reg1 = pP
6c30: 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d  arse->regRowid =
6c40: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
6c50: 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50 61 72  .    reg2 = pPar
6c60: 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b  se->regRoot = ++
6c70: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
6c80: 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73    reg3 = ++pPars
6c90: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
6ca0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6cb0: 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  , OP_ReadCookie,
6cc0: 20 69 44 62 2c 20 72 65 67 33 2c 20 31 29 3b 20   iDb, reg3, 1); 
6cd0: 20 20 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61 74    /* file_format
6ce0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
6cf0: 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
6d00: 69 44 62 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73  iDb);.    j1 = s
6d10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
6d20: 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33 29  (v, OP_If, reg3)
6d30: 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74  ;.    fileFormat
6d40: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
6d50: 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
6d60: 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20  eFmt)!=0 ?.     
6d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 3a               1 :
6d80: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45   SQLITE_MAX_FILE
6d90: 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c  _FORMAT;.    sql
6da0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6db0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66 69  , OP_Integer, fi
6dc0: 6c 65 46 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b  leFormat, reg3);
6dd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6de0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
6df0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 2c 20  Cookie, iDb, 1, 
6e00: 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg3);.    sqlit
6e10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6e20: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43 28  OP_Integer, ENC(
6e30: 64 62 29 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  db), reg3);.    
6e40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6e50: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
6e60: 65 2c 20 69 44 62 2c 20 34 2c 20 72 65 67 33 29  e, iDb, 4, reg3)
6e70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6e80: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
6e90: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a  ;..    /* This j
6ea0: 75 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c  ust creates a pl
6eb0: 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72  ace-holder recor
6ec0: 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  d in the sqlite_
6ed0: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20  master table..  
6ee0: 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20    ** The record 
6ef0: 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74  created does not
6f00: 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e   contain anythin
6f10: 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20  g yet.  It will 
6f20: 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20  be replaced.    
6f30: 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65  ** by the real e
6f40: 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e  ntry in code gen
6f50: 65 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65  erated at sqlite
6f60: 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20  3EndTable()..   
6f70: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
6f80: 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77  owid for the new
6f90: 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 6f   entry is left o
6fa0: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
6fb0: 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54   stack..    ** T
6fc0: 68 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20 69  he rowid value i
6fd0: 73 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20  s needed by the 
6fe0: 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65  code that sqlite
6ff0: 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20  3EndTable will. 
7000: 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a     ** generate..
7010: 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69      */.#if !defi
7020: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7030: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
7040: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
7050: 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20  RTUALTABLE).    
7060: 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69 73  if( isView || is
7070: 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20  Virtual ){.     
7080: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7090: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
70a0: 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20 20  , 0, reg2);.    
70b0: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
70c0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
70d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
70e0: 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69 44  _CreateTable, iD
70f0: 62 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a  b, reg2);.    }.
7100: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
7110: 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73  asterTable(pPars
7120: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
7130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7140: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30  , OP_NewRowid, 0
7150: 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c  , reg1);.    sql
7160: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7170: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
7180: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
7190: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
71a0: 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33  _Insert, 0, reg3
71b0: 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c  , reg1);.    sql
71c0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
71d0: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
71e0: 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  D);.    sqlite3V
71f0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
7200: 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Close);.  }..  /
7210: 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72  * Normal (non-er
7220: 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a  ror) return. */.
7230: 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20    return;..  /* 
7240: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
7250: 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65  rs, we jump here
7260: 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f   */.begin_table_
7270: 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33  error:.  sqlite3
7280: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
7290: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
72a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
72b0: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   is used to comp
72c0: 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20  are two strings 
72d0: 69 6e 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73  in a case-insens
72e0: 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a  itive manner..**
72f0: 20 49 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20   It is slightly 
7300: 66 61 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c  faster than call
7310: 69 6e 67 20 73 71 6c 69 74 65 33 53 74 72 49 43  ing sqlite3StrIC
7320: 6d 70 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62  mp() directly, b
7330: 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c  ut.** produces l
7340: 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  arger code..**.*
7350: 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20  * WARNING: This 
7360: 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d  macro is not com
7370: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 65  patible with the
7380: 20 73 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79   strcmp() family
7390: 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20  . It.** returns 
73a0: 74 72 75 65 20 69 66 20 74 68 65 20 74 77 6f 20  true if the two 
73b0: 73 74 72 69 6e 67 73 20 61 72 65 20 65 71 75 61  strings are equa
73c0: 6c 2c 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c  l, otherwise fal
73d0: 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  se..*/.#define S
73e0: 54 52 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a  TRICMP(x, y) (\.
73f0: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
7400: 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63  wer[*(unsigned c
7410: 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c  har *)(x)]==   \
7420: 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c  .sqlite3UpperToL
7430: 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20  ower[*(unsigned 
7440: 63 68 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20  char *)(y)]     
7450: 5c 0a 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  \.&& sqlite3StrI
7460: 43 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29  Cmp((x)+1,(y)+1)
7470: 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ==0 )../*.** Add
7480: 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f   a new column to
7490: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
74a0: 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
74b0: 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ructed..**.** Th
74c0: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
74d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65  his routine once
74e0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
74f0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20   declaration.** 
7500: 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
7510: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71  E statement.  sq
7520: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
7530: 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a  ) gets called.**
7540: 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68   first to get th
7550: 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65  ings going.  The
7560: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
7570: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63  s called for eac
7580: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  h.** column..*/.
7590: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
75a0: 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61  olumn(Parse *pPa
75b0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
75c0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
75d0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
75e0: 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *z;.  Column *pC
75f0: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
7600: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
7610: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
7620: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
7630: 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 53   ) return;.#if S
7640: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
7650: 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31  .  if( p->nCol+1
7660: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
7670: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
7680: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
7690: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
76a0: 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
76b0: 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61  s on %s", p->zNa
76c0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
76d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20  .  }.#endif.  z 
76e0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
76f0: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
7700: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
7710: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
7720: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7730: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
7740: 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70  if( STRICMP(z, p
7750: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
7760: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7770: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7780: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
7790: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
77a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
77b0: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
77c0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
77d0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
77e0: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
77f0: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
7800: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
7810: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
7820: 28 70 50 61 72 73 65 2d 3e 64 62 2c 70 2d 3e 61  (pParse->db,p->a
7830: 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a  Col,(p->nCol+8)*
7840: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
7850: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  ]));.    if( aNe
7860: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
7870: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7880: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
7890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
78a0: 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a  Col = aNew;.  }.
78b0: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
78c0: 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65  l[p->nCol];.  me
78d0: 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69  mset(pCol, 0, si
78e0: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
78f0: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  );.  pCol->zName
7900: 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20   = z;. .  /* If 
7910: 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65  there is no type
7920: 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75   specified, colu
7930: 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66  mns have the def
7940: 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20  ault affinity.  
7950: 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68  ** 'NONE'. If th
7960: 65 72 65 20 69 73 20 61 20 74 79 70 65 20 73 70  ere is a type sp
7970: 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71  ecified, then sq
7980: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79  lite3AddColumnTy
7990: 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  pe() will.  ** b
79a0: 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f  e called next to
79b0: 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   set pCol->affin
79c0: 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ity correctly.. 
79d0: 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69   */.  pCol->affi
79e0: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
79f0: 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e 43 6f  F_NONE;.  p->nCo
7a00: 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  l++;.}../*.** Th
7a10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
7a20: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
7a30: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
7a40: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
7a50: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
7a60: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
7a70: 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  A "NOT NULL" con
7a80: 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62  straint has.** b
7a90: 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f  een seen on a co
7aa0: 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  lumn.  This rout
7ab0: 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74  ine sets the not
7ac0: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20  Null flag on.** 
7ad0: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
7ae0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
7af0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
7b00: 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75   sqlite3AddNotNu
7b10: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
7b20: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
7b30: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
7b40: 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  t i;.  if( (p = 
7b50: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
7b60: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
7b70: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
7b80: 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d  .  if( i>=0 ) p-
7b90: 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[i].notNull
7ba0: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f   = onError;.}../
7bb0: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f  *.** Scan the co
7bc0: 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a  lumn type name z
7bd0: 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79  Type (length nTy
7be0: 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74  pe) and return t
7bf0: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
7c00: 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a   affinity type..
7c10: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7c20: 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69  ne does a case-i
7c30: 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63  ndependent searc
7c40: 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74  h of zType for t
7c50: 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67  he .** substring
7c60: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
7c70: 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65  ng table. If one
7c80: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
7c90: 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20  gs is.** found, 
7ca0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
7cb0: 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65  g affinity is re
7cc0: 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65  turned. If zType
7cd0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72   contains.** mor
7ce0: 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68  e than one of th
7cf0: 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e  e substrings, en
7d00: 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65  tries toward the
7d10: 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20   top of .** the 
7d20: 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72  table take prior
7d30: 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ity. For example
7d40: 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42  , if zType is 'B
7d50: 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c  LOBINT', .** SQL
7d60: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
7d70: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
7d80: 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20  ** Substring    
7d90: 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d   | Affinity.** -
7da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7dc0: 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20  ** 'INT'        
7dd0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   | SQLITE_AFF_IN
7de0: 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20  TEGER.** 'CHAR' 
7df0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7e00: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f  AFF_TEXT.** 'CLO
7e10: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
7e20: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
7e30: 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53  TEXT'        | S
7e40: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
7e50: 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'BLOB'        
7e60: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  | SQLITE_AFF_NON
7e70: 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20  E.** 'REAL'     
7e80: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7e90: 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20  REAL.** 'FLOA'  
7ea0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7eb0: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42  FF_REAL.** 'DOUB
7ec0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7ed0: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a  E_AFF_REAL.**.**
7ee0: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
7ef0: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
7f00: 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72  e above table ar
7f10: 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49  e found,.** SQLI
7f20: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69  TE_AFF_NUMERIC i
7f30: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63  s returned..*/.c
7f40: 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e  har sqlite3Affin
7f50: 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 54 6f  ityType(const To
7f60: 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 75  ken *pType){.  u
7f70: 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72  32 h = 0;.  char
7f80: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7f90: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e  F_NUMERIC;.  con
7fa0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
7fb0: 20 2a 7a 49 6e 20 3d 20 70 54 79 70 65 2d 3e 7a   *zIn = pType->z
7fc0: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
7fd0: 65 64 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20  ed char *zEnd = 
7fe0: 26 70 54 79 70 65 2d 3e 7a 5b 70 54 79 70 65 2d  &pType->z[pType-
7ff0: 3e 6e 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a  >n];..  while( z
8000: 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a 20 20 20 20  In!=zEnd ){.    
8010: 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c  h = (h<<8) + sql
8020: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
8030: 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b  [*zIn];.    zIn+
8040: 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28  +;.    if( h==((
8050: 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31  'c'<<24)+('h'<<1
8060: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29  6)+('a'<<8)+'r')
8070: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
8080: 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20  /* CHAR */.     
8090: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
80a0: 46 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c  F_TEXT; .    }el
80b0: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c  se if( h==(('c'<
80c0: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
80d0: 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20  'o'<<8)+'b') ){ 
80e0: 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f        /* CLOB */
80f0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
8100: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
8110: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
8120: 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c  ('t'<<24)+('e'<<
8130: 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27  16)+('x'<<8)+'t'
8140: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45  ) ){       /* TE
8150: 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  XT */.      aff 
8160: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
8170: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
8180: 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28   h==(('b'<<24)+(
8190: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
81a0: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
81b0: 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  /* BLOB */.     
81c0: 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49     && (aff==SQLI
81d0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c  TE_AFF_NUMERIC |
81e0: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
81f0: 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20  F_REAL) ){.     
8200: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8210: 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65 66 20  F_NONE;.#ifndef 
8220: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
8230: 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d  TING_POINT.    }
8240: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72  else if( h==(('r
8250: 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29  '<<24)+('e'<<16)
8260: 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20  +('a'<<8)+'l')  
8270: 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20          /* REAL 
8280: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
8290: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
82a0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
82b0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
82c0: 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  REAL;.    }else 
82d0: 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34  if( h==(('f'<<24
82e0: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
82f0: 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20 20  <<8)+'a')       
8300: 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20     /* FLOA */.  
8310: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
8320: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
8330: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
8340: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
8350: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
8360: 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f  ==(('d'<<24)+('o
8370: 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b  '<<16)+('u'<<8)+
8380: 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'b')          /*
8390: 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20   DOUB */.       
83a0: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
83b0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
83c0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
83d0: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64  E_AFF_REAL;.#end
83e0: 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  if.    }else if(
83f0: 20 28 68 26 30 78 30 30 46 46 46 46 46 46 29 3d   (h&0x00FFFFFF)=
8400: 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27  =(('i'<<16)+('n'
8410: 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20  <<8)+'t') ){    
8420: 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20  /* INT */.      
8430: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
8440: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
8450: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
8460: 0a 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ..  return aff;.
8470: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8480: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8490: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
84a0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
84b0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
84c0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
84d0: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70  tatement.  The p
84e0: 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74  First token is t
84f0: 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65  he first.** toke
8500: 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  n in the sequenc
8510: 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74  e of tokens that
8520: 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 79   describe the ty
8530: 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c  pe of the.** col
8540: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
8550: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
8560: 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68 65  .   pLast is the
8570: 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69   last token.** i
8580: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20  n the sequence. 
8590: 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d   Use this inform
85a0: 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75  ation to constru
85b0: 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74  ct a string.** t
85c0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
85d0: 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65   typename of the
85e0: 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72   column and stor
85f0: 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a  e that string.**
8600: 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76   in zType..*/ .v
8610: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
8620: 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a  lumnType(Parse *
8630: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
8640: 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Type){.  Table *
8650: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  p;.  int i;.  Co
8660: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71  lumn *pCol;.  sq
8670: 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
8680: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
8690: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
86a0: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
86b0: 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c  nCol-1;.  if( i<
86c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43  0 ) return;.  pC
86d0: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d  ol = &p->aCol[i]
86e0: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
86f0: 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >db;.  sqlite3Db
8700: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
8710: 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  Type);.  pCol->z
8720: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Type = sqlite3Na
8730: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
8740: 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e  pType);.  pCol->
8750: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
8760: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
8770: 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Type);.}../*.** 
8780: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
8790: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  s the default va
87a0: 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  lue for the most
87b0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
87c0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65  column.** of the
87d0: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
87e0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
87f0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75  ion..**.** Defau
8800: 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73  lt value express
8810: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e  ions must be con
8820: 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e  stant.  Raise an
8830: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68   exception if th
8840: 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65  is.** is not the
8850: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   case..**.** Thi
8860: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8870: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
8880: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
8890: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
88a0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
88b0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  LE statement..*/
88c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
88d0: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72  DefaultValue(Par
88e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
88f0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 61 62 6c   *pExpr){.  Tabl
8900: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
8910: 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  pCol;.  sqlite3 
8920: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
8930: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
8940: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 21  rse->pNewTable)!
8950: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d  =0 ){.    pCol =
8960: 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43   &(p->aCol[p->nC
8970: 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  ol-1]);.    if( 
8980: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
8990: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
89a0: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
89b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
89c0: 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c  (pParse, "defaul
89d0: 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d  t value of colum
89e0: 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f  n [%s] is not co
89f0: 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20  nstant",.       
8a00: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b     pCol->zName);
8a10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8a20: 20 20 45 78 70 72 20 2a 70 43 6f 70 79 3b 0a 20    Expr *pCopy;. 
8a30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8a40: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
8a50: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70  >pDflt);.      p
8a60: 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 70 43 6f  Col->pDflt = pCo
8a70: 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  py = sqlite3Expr
8a80: 44 75 70 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  Dup(db, pExpr);.
8a90: 20 20 20 20 20 20 69 66 28 20 70 43 6f 70 79 20        if( pCopy 
8aa0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8ab0: 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20  e3TokenCopy(db, 
8ac0: 26 70 43 6f 70 79 2d 3e 73 70 61 6e 2c 20 26 70  &pCopy->span, &p
8ad0: 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
8ae0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
8af0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8b00: 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d  te(db, pExpr);.}
8b10: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74  ../*.** Designat
8b20: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
8b30: 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  Y for the table.
8b40: 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73    pList is a lis
8b50: 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f  t of names .** o
8b60: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66  f columns that f
8b70: 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20  orm the primary 
8b80: 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69  key.  If pList i
8b90: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
8ba0: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  .** most recentl
8bb0: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f  y added column o
8bc0: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74  f the table is t
8bd0: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a  he primary key..
8be0: 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61  **.** A table ca
8bf0: 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  n have at most o
8c00: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  ne primary key. 
8c10: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   If the table al
8c20: 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70  ready has.** a p
8c30: 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20  rimary key (and 
8c40: 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f  this is the seco
8c50: 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20  nd primary key) 
8c60: 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a  then create an.*
8c70: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  * error..**.** I
8c80: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
8c90: 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  Y is on a single
8ca0: 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61   column whose da
8cb0: 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45  tatype is INTEGE
8cc0: 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69  R,.** then we wi
8cd0: 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
8ce0: 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  at column as the
8cf0: 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65   rowid.  Set the
8d00: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
8d10: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
8d20: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
8d30: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
8d40: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
8d50: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
8d60: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
8d70: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
8d80: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
8d90: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
8da0: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
8db0: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
8dc0: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
8dd0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
8de0: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
8df0: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
8e00: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
8e10: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
8e20: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
8e30: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
8e40: 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
8e50: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
8e60: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
8e70: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
8e80: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
8e90: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69  ,  /* List of fi
8ea0: 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20  eld names to be 
8eb0: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
8ec0: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
8ed0: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
8ee0: 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63  h a uniqueness c
8ef0: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74  onflict */.  int
8f00: 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f   autoInc,      /
8f10: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55  * True if the AU
8f20: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77  TOINCREMENT keyw
8f30: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
8f40: 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
8f50: 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  r     /* SQLITE_
8f60: 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45  SO_ASC or SQLITE
8f70: 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20  _SO_DESC */.){. 
8f80: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
8f90: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8fa0: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20  ;.  char *zType 
8fb0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
8fc0: 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70  = -1, i;.  if( p
8fd0: 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43  Tab==0 || IN_DEC
8fe0: 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f  LARE_VTAB ) goto
8ff0: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
9000: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  t;.  if( pTab->t
9010: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
9020: 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20  PrimaryKey ){.  
9030: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9040: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
9050: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68   "table \"%s\" h
9060: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
9070: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70   primary key", p
9080: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
9090: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
90a0: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
90b0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
90c0: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
90d0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
90e0: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
90f0: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
9100: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
9110: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
9120: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
9130: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
9140: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
9150: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
9160: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
9170: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
9180: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
9190: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
91a0: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
91b0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
91c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
91d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
91e0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
91f0: 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  if( iCol<pTab->n
9200: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Col ){.        p
9210: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9220: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
9230: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9240: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70   if( pList->nExp
9250: 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b  r>1 ) iCol = -1;
9260: 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
9270: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
9280: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79  >nCol ){.    zTy
9290: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
92a0: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d  iCol].zType;.  }
92b0: 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26 26 20  .  if( zType && 
92c0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
92d0: 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29  Type, "INTEGER")
92e0: 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 73  ==0.        && s
92f0: 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45  ortOrder==SQLITE
9300: 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 70  _SO_ASC ){.    p
9310: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
9320: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
9330: 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Conf = onError;.
9340: 20 20 20 20 61 73 73 65 72 74 28 20 61 75 74 6f      assert( auto
9350: 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e  Inc==0 || autoIn
9360: 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62  c==1 );.    pTab
9370: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61 75  ->tabFlags |= au
9380: 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63  toInc*TF_Autoinc
9390: 72 65 6d 65 6e 74 3b 0a 20 20 7d 65 6c 73 65 20  rement;.  }else 
93a0: 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23  if( autoInc ){.#
93b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
93c0: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
93d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
93e0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55  rMsg(pParse, "AU
93f0: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f  TOINCREMENT is o
9400: 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61  nly allowed on a
9410: 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45  n ".       "INTE
9420: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
9430: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
9440: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72  e{.    sqlite3Cr
9450: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
9460: 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  , 0, 0, 0, pList
9470: 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 2c  , onError, 0, 0,
9480: 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a   sortOrder, 0);.
9490: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
94a0: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
94b0: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45  exit:.  sqlite3E
94c0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
94d0: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29  arse->db, pList)
94e0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
94f0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43  *.** Add a new C
9500: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
9510: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
9520: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
9530: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
9540: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65  id sqlite3AddChe
9550: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ckConstraint(.  
9560: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
9570: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
9580: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
9590: 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54  pCheckExpr  /* T
95a0: 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  he check express
95b0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ion */.){.  sqli
95c0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
95d0: 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51  ->db;.#ifndef SQ
95e0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
95f0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
9600: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
9610: 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26  e;.  if( pTab &&
9620: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
9630: 42 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  B ){.    /* The 
9640: 43 48 45 43 4b 20 65 78 70 72 65 73 73 69 6f 6e  CHECK expression
9650: 20 6d 75 73 74 20 62 65 20 64 75 70 6c 69 63 61   must be duplica
9660: 74 65 64 20 73 6f 20 74 68 61 74 20 74 6f 6b 65  ted so that toke
9670: 6e 73 20 72 65 66 65 72 0a 20 20 20 20 2a 2a 20  ns refer.    ** 
9680: 74 6f 20 6d 61 6c 6c 6f 63 65 64 20 73 70 61 63  to malloced spac
9690: 65 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 28 65  e and not the (e
96a0: 70 68 65 6d 65 72 61 6c 29 20 74 65 78 74 20 6f  phemeral) text o
96b0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
96c0: 4c 45 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  LE.    ** statem
96d0: 65 6e 74 20 2a 2f 0a 20 20 20 20 70 54 61 62 2d  ent */.    pTab-
96e0: 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  >pCheck = sqlite
96f0: 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 54 61  3ExprAnd(db, pTa
9700: 62 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20  b->pCheck, .    
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
9730: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
9740: 20 70 43 68 65 63 6b 45 78 70 72 29 29 3b 0a 20   pCheckExpr));. 
9750: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
9760: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
9770: 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 7d  , pCheckExpr);.}
9780: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
9790: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
97a0: 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
97b0: 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74  ecently parsed t
97c0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74  able column.** t
97d0: 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69  o the CollSeq gi
97e0: 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ven..*/.void sql
97f0: 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79  ite3AddCollateTy
9800: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
9810: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
9820: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
9830: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
9840: 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
9850: 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e     /* Dequoted n
9860: 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e  ame of collation
9870: 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73   sequence */.  s
9880: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
9890: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
98a0: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
98b0: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
98c0: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20  >nCol-1;.  db = 
98d0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43  pParse->db;.  zC
98e0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  oll = sqlite3Nam
98f0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
9900: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a  Token);.  if( !z
9910: 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a  Coll ) return;..
9920: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63    if( sqlite3Loc
9930: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
9940: 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b  e, zColl, -1) ){
9950: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
9960: 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d  ;.    p->aCol[i]
9970: 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a  .zColl = zColl;.
9980: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
9990: 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61   column is decla
99a0: 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50  red as "<name> P
99b0: 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41  RIMARY KEY COLLA
99c0: 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20  TE <type>",.    
99d0: 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78  ** then an index
99e0: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63   may have been c
99f0: 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63  reated on this c
9a00: 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65  olumn before the
9a10: 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  .    ** collatio
9a20: 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65 64  n type was added
9a30: 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20 69  . Correct this i
9a40: 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73 65  f it is the case
9a50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
9a60: 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b  (pIdx=p->pIndex;
9a70: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
9a80: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
9a90: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
9aa0: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
9ab0: 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
9ac0: 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20  lumn[0]==i ){.  
9ad0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
9ae0: 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b  ll[0] = p->aCol[
9af0: 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  i].zColl;.      
9b00: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
9b10: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
9b20: 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
9b30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
9b40: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
9b50: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
9b60: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74  sequence for dat
9b70: 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 65 78  abase native tex
9b80: 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64  t.** encoding id
9b90: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
9ba0: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65  string zName, le
9bb0: 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a  ngth nName..**.*
9bc0: 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
9bd0: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
9be0: 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61  uence is not ava
9bf0: 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61  ilable, or not a
9c00: 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74  vailable.** in t
9c10: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74 69  he database nati
9c20: 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65  ve encoding, the
9c30: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
9c40: 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  ry is invoked to
9c50: 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20  .** request it. 
9c60: 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  If the collation
9c70: 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f   factory does no
9c80: 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 61 20  t supply such a 
9c90: 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64  sequence,.** and
9ca0: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 69 73   the sequence is
9cb0: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e   available in an
9cc0: 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64  other text encod
9cd0: 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69  ing, then that i
9ce0: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e  s.** returned in
9cf0: 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
9d00: 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  no versions of t
9d10: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
9d20: 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65  lations sequence
9d30: 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20   are available, 
9d40: 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72  or.** another er
9d50: 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ror occurs, NULL
9d60: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
9d70: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
9d80: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  e written into.*
9d90: 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20  * pParse..**.** 
9da0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
9db0: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
9dc0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
9dd0: 53 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75  Seq().  This rou
9de0: 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20  tine.** invokes 
9df0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
9e00: 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d  ctory if the nam
9e10: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e  ed collation can
9e20: 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20  not be found.** 
9e30: 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e  and generates an
9e40: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
9e50: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
9e60: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
9e70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9e80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
9e90: 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20  e, int nName){. 
9ea0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9eb0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20  Parse->db;.  u8 
9ec0: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
9ed0: 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64   u8 initbusy = d
9ee0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20  b->init.busy;.  
9ef0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
9f00: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
9f10: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
9f20: 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  , enc, zName, nN
9f30: 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a  ame, initbusy);.
9f40: 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20    if( !initbusy 
9f50: 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70  && (!pColl || !p
9f60: 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20  Coll->xCmp) ){. 
9f70: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
9f80: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c  e3GetCollSeq(db,
9f90: 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 2c 20 6e   pColl, zName, n
9fa0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Name);.    if( !
9fb0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  pColl ){.      i
9fc0: 66 28 20 6e 4e 61 6d 65 3c 30 20 29 7b 0a 20 20  f( nName<0 ){.  
9fd0: 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71        nName = sq
9fe0: 6c 69 74 65 33 53 74 72 6c 65 6e 28 64 62 2c 20  lite3Strlen(db, 
9ff0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
a000: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
a010: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
a020: 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e  o such collation
a030: 20 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22   sequence: %.*s"
a040: 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  , nName, zName);
a050: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30  .      pColl = 0
a060: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
a070: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
a080: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
a090: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
a0a0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68  ncrement the sch
a0b0: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a  ema cookie..**.*
a0c0: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
a0d0: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
a0e0: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
a0f0: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
a100: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
a110: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
a120: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
a130: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
a140: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
a150: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
a160: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
a170: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
a180: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
a190: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
a1a0: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
a1b0: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
a1c0: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
a1d0: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
a1e0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
a1f0: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
a200: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
a210: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
a220: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
a230: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
a240: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
a250: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
a260: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
a270: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
a280: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
a290: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
a2a0: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
a2b0: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
a2c0: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
a2d0: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
a2e0: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
a2f0: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
a300: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
a310: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
a320: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
a330: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
a340: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
a350: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68  /.void sqlite3Ch
a360: 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73 65  angeCookie(Parse
a370: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
a380: 62 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  b){.  int r1 = s
a390: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
a3a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
a3b0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
a3c0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
a3d0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
a3e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
a3f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
a400: 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  er, db->aDb[iDb]
a410: 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
a420: 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72 31 29 3b 0a  _cookie+1, r1);.
a430: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a440: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
a450: 6b 69 65 2c 20 69 44 62 2c 20 30 2c 20 72 31 29  kie, iDb, 0, r1)
a460: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
a470: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
a480: 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , r1);.}../*.** 
a490: 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62  Measure the numb
a4a0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
a4b0: 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75   needed to outpu
a4c0: 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69  t the given.** i
a4d0: 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20  dentifier.  The 
a4e0: 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
a4f0: 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f  includes any quo
a500: 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20  tes used.** but 
a510: 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
a520: 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e   the null termin
a530: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
a540: 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73  estimate is cons
a550: 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69  ervative.  It mi
a560: 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
a570: 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65  at what is.** re
a580: 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  ally needed..*/.
a590: 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74  static int ident
a5a0: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
a5b0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  r *z){.  int n;.
a5c0: 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e    for(n=0; *z; n
a5d0: 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, z++){.    if
a5e0: 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b  ( *z=='"' ){ n++
a5f0: 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ; }.  }.  return
a600: 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   n + 2;.}../*.**
a610: 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69   Write an identi
a620: 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e  fier onto the en
a630: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73  d of the given s
a640: 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71  tring.  Add.** q
a650: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20  uote characters 
a660: 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  as needed..*/.st
a670: 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50  atic void identP
a680: 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ut(char *z, int 
a690: 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69  *pIdx, char *zSi
a6a0: 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e  gnedIdent){.  un
a6b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64  signed char *zId
a6c0: 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ent = (unsigned 
a6d0: 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65  char*)zSignedIde
a6e0: 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  nt;.  int i, j, 
a6f0: 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d  needQuote;.  i =
a700: 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d   *pIdx;.  for(j=
a710: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
a720: 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61  +){.    if( !isa
a730: 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20  lnum(zIdent[j]) 
a740: 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f  && zIdent[j]!='_
a750: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ' ) break;.  }. 
a760: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49   needQuote =  zI
a770: 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73  dent[j]!=0 || is
a780: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
a790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a7a0: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79     || sqlite3Key
a7b0: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
a7c0: 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66   j)!=TK_ID;.  if
a7d0: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
a7e0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f  i++] = '"';.  fo
a7f0: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
a800: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b  ; j++){.    z[i+
a810: 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a  +] = zIdent[j];.
a820: 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a      if( zIdent[j
a830: 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20  ]=='"' ) z[i++] 
a840: 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28  = '"';.  }.  if(
a850: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
a860: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69  ++] = '"';.  z[i
a870: 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d  ] = 0;.  *pIdx =
a880: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   i;.}../*.** Gen
a890: 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54  erate a CREATE T
a8a0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61  ABLE statement a
a8b0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
a8c0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c  he given.** tabl
a8d0: 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f  e.  Memory to ho
a8e0: 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  ld the text of t
a8f0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
a900: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
a910: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
a920: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
a930: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
a940: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
a950: 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74  atic char *creat
a960: 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c 69 74  eTableStmt(sqlit
a970: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
a980: 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20  , int isTemp){. 
a990: 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20   int i, k, n;.  
a9a0: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63  char *zStmt;.  c
a9b0: 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70  har *zSep, *zSep
a9c0: 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20  2, *zEnd, *z;.  
a9d0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
a9e0: 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f  n = 0;.  for(pCo
a9f0: 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  l = p->aCol, i=0
aa00: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
aa10: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e  , pCol++){.    n
aa20: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
aa30: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
aa40: 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70    z = pCol->zTyp
aa50: 65 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a  e;.    if( z ){.
aa60: 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c        n += (strl
aa70: 65 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20  en(z) + 1);.    
aa80: 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65  }.  }.  n += ide
aa90: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d  ntLength(p->zNam
aaa0: 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29  e);.  if( n<50 )
aab0: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b  {.    zSep = "";
aac0: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22  .    zSep2 = ","
aad0: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22  ;.    zEnd = ")"
aae0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
aaf0: 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20  Sep = "\n  ";.  
ab00: 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20    zSep2 = ",\n  
ab10: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c  ";.    zEnd = "\
ab20: 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  n)";.  }.  n += 
ab30: 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a  35 + 6*p->nCol;.
ab40: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
ab50: 33 4d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20  3Malloc( n );.  
ab60: 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( zStmt==0 ){.
ab70: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
ab80: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65  iled = 1;.    re
ab90: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
aba0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
abb0: 2c 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 20  , zStmt,.       
abc0: 20 20 20 20 20 20 20 20 20 20 20 21 4f 4d 49 54             !OMIT
abd0: 5f 54 45 4d 50 44 42 26 26 69 73 54 65 6d 70 20  _TEMPDB&&isTemp 
abe0: 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54  ? "CREATE TEMP T
abf0: 41 42 4c 45 20 22 3a 22 43 52 45 41 54 45 20 54  ABLE ":"CREATE T
ac00: 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73  ABLE ");.  k = s
ac10: 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20  trlen(zStmt);.  
ac20: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
ac30: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
ac40: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
ac50: 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d  ';.  for(pCol=p-
ac60: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
ac70: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
ac80: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
ac90: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
aca0: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b  zStmt[k], zSep);
acb0: 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e  .    k += strlen
acc0: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
acd0: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
ace0: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
acf0: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
ad00: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 20  me);.    if( (z 
ad10: 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d  = pCol->zType)!=
ad20: 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74  0 ){.      zStmt
ad30: 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [k++] = ' ';.   
ad40: 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29     assert( (int)
ad50: 28 73 74 72 6c 65 6e 28 7a 29 2b 6b 2b 31 29 3c  (strlen(z)+k+1)<
ad60: 3d 6e 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =n );.      sqli
ad70: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b  te3_snprintf(n-k
ad80: 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73  , &zStmt[k], "%s
ad90: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b  ", z);.      k +
ada0: 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20  = strlen(z);.   
adb0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
adc0: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
add0: 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20  zStmt[k], "%s", 
ade0: 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  zEnd);.  return 
adf0: 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zStmt;.}../*.** 
ae00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
ae10: 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74  called to report
ae20: 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74   the final ")" t
ae30: 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a  hat terminates.*
ae40: 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  * a CREATE TABLE
ae50: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
ae60: 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75  * The table stru
ae70: 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72  cture that other
ae80: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
ae90: 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64   have been build
aea0: 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ing.** is added 
aeb0: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
aec0: 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73  hash tables, ass
aed0: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
aee0: 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64  have.** occurred
aef0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79  ..**.** An entry
af00: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
af10: 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61  s made in the ma
af20: 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  ster table on di
af30: 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68  sk, unless.** th
af40: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
af50: 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69  y table or db->i
af60: 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68  nit.busy==1.  Wh
af70: 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  en db->init.busy
af80: 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  ==1.** it means 
af90: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
afa0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
afb0: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
afc0: 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63  e just.** connec
afd0: 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ted to the datab
afe0: 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  ase or because t
aff0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
b000: 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65   table has.** re
b010: 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20  cently changed, 
b020: 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  so the entry for
b030: 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65   this table alre
b040: 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a  ady exists in.**
b050: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
b060: 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f  er table.  We do
b070: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
b080: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a  ate it again..**
b090: 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65  .** If the pSele
b0a0: 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ct argument is n
b0b0: 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ot NULL, it mean
b0c0: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
b0d0: 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65  ine.** was calle
b0e0: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61  d to create a ta
b0f0: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72  ble generated fr
b100: 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45  om a .** "CREATE
b110: 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45   TABLE ... AS SE
b120: 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d  LECT ..." statem
b130: 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ent.  The column
b140: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
b150: 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20   new table will 
b160: 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74  match the result
b170: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
b180: 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
b190: 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50  te3EndTable(.  P
b1a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
b1b0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
b1c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
b1d0: 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20  en *pCons,      
b1e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20       /* The ',' 
b1f0: 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20  token after the 
b200: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e  last column defn
b210: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  . */.  Token *pE
b220: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd,            /
b230: 2a 20 54 68 65 20 66 69 6e 61 6c 20 27 29 27 20  * The final ')' 
b240: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 43 52 45  token in the CRE
b250: 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53  ATE TABLE */.  S
b260: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
b270: 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
b280: 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20   from a "CREATE 
b290: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a  ... AS SELECT" *
b2a0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
b2b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b2c0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
b2d0: 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 28  nt iDb;..  if( (
b2e0: 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65  pEnd==0 && pSele
b2f0: 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65  ct==0) || pParse
b300: 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
b310: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
b320: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b330: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
b340: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
b350: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
b360: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
b370: 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65  t.busy || !pSele
b380: 63 74 20 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73  ct );..  iDb = s
b390: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
b3a0: 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65  dex(db, p->pSche
b3b0: 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
b3c0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
b3d0: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d    /* Resolve nam
b3e0: 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20  es in all CHECK 
b3f0: 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65  constraint expre
b400: 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ssions..  */.  i
b410: 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a  f( p->pCheck ){.
b420: 20 20 20 20 53 72 63 4c 69 73 74 20 73 53 72 63      SrcList sSrc
b430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b440: 20 20 20 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c      /* Fake SrcL
b450: 69 73 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e  ist for pParse->
b460: 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20 20  pNewTable */.   
b470: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
b480: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b490: 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
b4a0: 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65   for pParse->pNe
b4b0: 77 54 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6d  wTable */..    m
b4c0: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
b4d0: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
b4e0: 20 6d 65 6d 73 65 74 28 26 73 53 72 63 2c 20 30   memset(&sSrc, 0
b4f0: 2c 20 73 69 7a 65 6f 66 28 73 53 72 63 29 29 3b  , sizeof(sSrc));
b500: 0a 20 20 20 20 73 53 72 63 2e 6e 53 72 63 20 3d  .    sSrc.nSrc =
b510: 20 31 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30   1;.    sSrc.a[0
b520: 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61  ].zName = p->zNa
b530: 6d 65 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30  me;.    sSrc.a[0
b540: 5d 2e 70 54 61 62 20 3d 20 70 3b 0a 20 20 20 20  ].pTab = p;.    
b550: 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f  sSrc.a[0].iCurso
b560: 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 4e 43 2e  r = -1;.    sNC.
b570: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
b580: 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
b590: 74 20 3d 20 26 73 53 72 63 3b 0a 20 20 20 20 73  t = &sSrc;.    s
b5a0: 4e 43 2e 69 73 43 68 65 63 6b 20 3d 20 31 3b 0a  NC.isCheck = 1;.
b5b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52      if( sqlite3R
b5c0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
b5d0: 26 73 4e 43 2c 20 70 2d 3e 70 43 68 65 63 6b 29  &sNC, p->pCheck)
b5e0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b5f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
b600: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
b610: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
b620: 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) */..  /* If th
b630: 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
b640: 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65  is 1 it means we
b650: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
b660: 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a   SQL off the.  *
b670: 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  * "sqlite_master
b680: 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d  " or "sqlite_tem
b690: 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  p_master" table 
b6a0: 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a  on the disk..  *
b6b0: 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74  * So do not writ
b6c0: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67  e to the disk ag
b6d0: 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68  ain.  Extract th
b6e0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
b6f0: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
b700: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64  table from the d
b710: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20  b->init.newTnum 
b720: 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67  field.  (The pag
b730: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68  e number.  ** sh
b740: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
b750: 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20  ut there by the 
b760: 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75  sqliteOpenCb rou
b770: 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  tine.).  */.  if
b780: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
b790: 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d  ){.    p->tnum =
b7a0: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
b7b0: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
b7c0: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
b7d0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
b7e0: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
b7f0: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
b800: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
b810: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
b820: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72  database.  The r
b830: 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a  ecord number.  *
b840: 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  * for the new ta
b850: 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64  ble entry should
b860: 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74   already be on t
b870: 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20  he stack..  **. 
b880: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
b890: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
b8a0: 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72  , write the entr
b8b0: 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c  y into the auxil
b8c0: 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69  iary.  ** file i
b8d0: 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74  nstead of into t
b8e0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
b8f0: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
b900: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
b910: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
b920: 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
b930: 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20  char *zType;    
b940: 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61  /* "view" or "ta
b950: 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  ble" */.    char
b960: 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22   *zType2;   /* "
b970: 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22  VIEW" or "TABLE"
b980: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
b990: 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20  tmt;    /* Text 
b9a0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
b9b0: 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49  BLE or CREATE VI
b9c0: 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EW statement */.
b9d0: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
b9e0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
b9f0: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
ba00: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c  return;..    sql
ba10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
ba20: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a  , OP_Close, 0);.
ba30: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
ba40: 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20  he rootpage for 
ba50: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 61 6e  the new table an
ba60: 64 20 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74  d push it onto t
ba70: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a  he stack..    **
ba80: 20 41 20 76 69 65 77 20 68 61 73 20 6e 6f 20 72   A view has no r
ba90: 6f 6f 74 70 61 67 65 2c 20 73 6f 20 6a 75 73 74  ootpage, so just
baa0: 20 70 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e 74   push a zero ont
bab0: 6f 20 74 68 65 20 73 74 61 63 6b 20 66 6f 72 0a  o the stack for.
bac0: 20 20 20 20 2a 2a 20 76 69 65 77 73 2e 20 20 49      ** views.  I
bad0: 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20  nitialize zType 
bae0: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
baf0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
bb00: 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
bb10: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
bb20: 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
bb30: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62      zType = "tab
bb40: 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  le";.      zType
bb50: 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66  2 = "TABLE";.#if
bb60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bb70: 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b  _VIEW.    }else{
bb80: 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
bb90: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
bba0: 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
bbb0: 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
bbc0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
bbd0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
bbe0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
bbf0: 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
bc00: 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
bc10: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
bc20: 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
bc30: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
bc40: 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
bc50: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
bc60: 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
bc70: 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  s on the top of 
bc80: 74 68 65 20 76 64 62 65 20 73 74 61 63 6b 2e 0a  the vdbe stack..
bc90: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
bca0: 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61  ce the SELECT ha
bcb0: 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20  s been coded by 
bcc0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c  sqlite3Select(),
bcd0: 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20   it is in a.    
bce0: 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74  ** suitable stat
bcf0: 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74  e to query for t
bd00: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
bd10: 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20  and types to be 
bd20: 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  used.    ** by t
bd30: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20  he new table..  
bd40: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68    **.    ** A sh
bd50: 61 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65  ared-cache write
bd60: 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71  -lock is not req
bd70: 75 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74  uired to write t
bd80: 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c  o the new table,
bd90: 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68  .    ** as a sch
bda0: 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61  ema-lock must ha
bdb0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
bdc0: 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61  obtained to crea
bdd0: 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20  te it. Since.   
bde0: 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   ** a schema-loc
bdf0: 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f  k excludes all o
be00: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73  ther database us
be10: 65 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c  ers, the write-l
be20: 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a  ock would.    **
be30: 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20   be redundant.. 
be40: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
be50: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53  elect ){.      S
be60: 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
be70: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65        Table *pSe
be80: 6c 54 61 62 3b 0a 0a 20 20 20 20 20 20 61 73 73  lTab;..      ass
be90: 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ert(pParse->nTab
bea0: 3d 3d 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ==0);.      sqli
beb0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
bec0: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
bed0: 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  , pParse->regRoo
bee0: 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  t, iDb);.      s
bef0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
bf00: 50 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20  P5(v, 1);.      
bf10: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32  pParse->nTab = 2
bf20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
bf30: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
bf40: 65 73 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20  est, SRT_Table, 
bf50: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
bf60: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
bf70: 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b  pSelect, &dest);
bf80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bf90: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
bfa0: 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  lose, 1);.      
bfb0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
bfc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
bfd0: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
bfe0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
bff0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
c000: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
c010: 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74  pSelTab==0 ) ret
c020: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  urn;.        ass
c030: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20  ert( p->aCol==0 
c040: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  );.        p->nC
c050: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
c060: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ol;.        p->a
c070: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
c080: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65  Col;.        pSe
c090: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
c0a0: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d          pSelTab-
c0b0: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
c0c0: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
c0d0: 54 61 62 6c 65 28 70 53 65 6c 54 61 62 29 3b 0a  Table(pSelTab);.
c0e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
c0f0: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
c100: 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
c110: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74  of the CREATE st
c120: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
c130: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
c140: 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61      zStmt = crea
c150: 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20  teTableStmt(db, 
c160: 70 2c 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  p, p->pSchema==d
c170: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
c180: 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  a);.    }else{. 
c190: 20 20 20 20 20 6e 20 3d 20 70 45 6e 64 2d 3e 7a       n = pEnd->z
c1a0: 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   - pParse->sName
c1b0: 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20  Token.z + 1;.   
c1c0: 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
c1d0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20  e3MPrintf(db, . 
c1e0: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
c1f0: 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65   %s %.*s", zType
c200: 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e  2, n, pParse->sN
c210: 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20  ameToken.z.     
c220: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
c230: 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65  * A slot for the
c240: 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65   record has alre
c250: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
c260: 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a  ed in the .    *
c270: 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  * SQLITE_MASTER 
c280: 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20  table.  We just 
c290: 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  need to update t
c2a0: 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c  hat slot with al
c2b0: 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66  l.    ** the inf
c2c0: 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63  ormation we've c
c2d0: 6f 6c 6c 65 63 74 65 64 2e 20 20 54 68 65 20 72  ollected.  The r
c2e0: 6f 77 69 64 20 66 6f 72 20 74 68 65 20 70 72 65  owid for the pre
c2f0: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a  allocated.    **
c300: 20 73 6c 6f 74 20 69 73 20 74 68 65 20 32 6e 64   slot is the 2nd
c310: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
c320: 63 6b 2e 20 20 54 68 65 20 74 6f 70 20 6f 66 20  ck.  The top of 
c330: 74 68 65 20 73 74 61 63 6b 20 69 73 20 74 68 65  the stack is the
c340: 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67  .    ** root pag
c350: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  e for the new ta
c360: 62 6c 65 20 28 6f 72 20 61 20 30 20 69 66 20 74  ble (or a 0 if t
c370: 68 69 73 20 69 73 20 61 20 76 69 65 77 29 2e 0a  his is a view)..
c380: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
c390: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
c3a0: 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44  arse,.      "UPD
c3b0: 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20  ATE %Q.%s ".    
c3c0: 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d 27       "SET type='
c3d0: 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62  %s', name=%Q, tb
c3e0: 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70  l_name=%Q, rootp
c3f0: 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20  age=#%d, sql=%Q 
c400: 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20  ".       "WHERE 
c410: 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20  rowid=#%d",.    
c420: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
c430: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
c440: 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 7a  LE(iDb),.      z
c450: 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Type,.      p->z
c460: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Name,.      p->z
c470: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72  Name,.      pPar
c480: 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20  se->regRoot,.   
c490: 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20     zStmt,.      
c4a0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
c4b0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
c4c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
c4d0: 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
c4e0: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
c4f0: 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66  arse, iDb);..#if
c500: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c510: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
c520: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
c530: 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ee if we need to
c540: 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74   create an sqlit
c550: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
c560: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70   for.    ** keep
c570: 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74  ing track of aut
c580: 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e  oincrement keys.
c590: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c5a0: 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
c5b0: 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29  _Autoincrement )
c5c0: 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20  {.      Db *pDb 
c5d0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
c5e0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
c5f0: 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62  pSchema->pSeqTab
c600: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
c610: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
c620: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
c630: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
c640: 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75  E %Q.sqlite_sequ
c650: 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c  ence(name,seq)",
c660: 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
c670: 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b  zName.        );
c680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
c690: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65  endif..    /* Re
c6a0: 70 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67  parse everything
c6b0: 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69   to update our i
c6c0: 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72  nternal data str
c6d0: 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73  uctures */.    s
c6e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
c6f0: 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (v, OP_ParseSche
c700: 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20  ma, iDb, 0, 0,. 
c710: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
c720: 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e  rintf(db, "tbl_n
c730: 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61  ame='%q'",p->zNa
c740: 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  me), P4_DYNAMIC)
c750: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64  ;.  }...  /* Add
c760: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68   the table to th
c770: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
c780: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
c790: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  e database..  */
c7a0: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
c7b0: 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e  busy && pParse->
c7c0: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54  nErr==0 ){.    T
c7d0: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
c7e0: 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20  FKey *pFKey; .  
c7f0: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
c800: 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a  a = p->pSchema;.
c810: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
c820: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53  e3HashInsert(&pS
c830: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
c840: 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  p->zName, strlen
c850: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 70 29 3b  (p->zName)+1,p);
c860: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
c870: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c880: 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
c890: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
c8a0: 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
c8b0: 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
c8c0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
c8d0: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  led = 1;.      r
c8e0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 69 66  eturn;.    }.#if
c8f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c900: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
c910: 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46   for(pFKey=p->pF
c920: 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65  Key; pFKey; pFKe
c930: 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72  y=pFKey->pNextFr
c940: 6f 6d 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  om){.      void 
c950: 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 69 6e 74  *data;.      int
c960: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
c970: 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20  Key->zTo) + 1;. 
c980: 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78       pFKey->pNex
c990: 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73  tTo = sqlite3Has
c9a0: 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e  hFind(&pSchema->
c9b0: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
c9c0: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 64  o, nTo);.      d
c9d0: 61 74 61 20 3d 20 73 71 6c 69 74 65 33 48 61 73  ata = sqlite3Has
c9e0: 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61  hInsert(&pSchema
c9f0: 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e  ->aFKey, pFKey->
ca00: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29  zTo, nTo, pFKey)
ca10: 3b 0a 20 20 20 20 20 20 69 66 28 20 64 61 74 61  ;.      if( data
ca20: 3d 3d 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 20  ==(void *)pFKey 
ca30: 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6d  ){.        db->m
ca40: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
ca50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
ca60: 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73 65  endif.    pParse
ca70: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b  ->pNewTable = 0;
ca80: 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b  .    db->nTable+
ca90: 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  +;.    db->flags
caa0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
cab0: 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64  nChanges;..#ifnd
cac0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
cad0: 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66  LTERTABLE.    if
cae0: 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b  ( !p->pSelect ){
caf0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
cb00: 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
cb10: 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d  t char *)pParse-
cb20: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20  >sNameToken.z;. 
cb30: 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a       int nName;.
cb40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
cb50: 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20  Select && pCons 
cb60: 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20  && pEnd );.     
cb70: 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30   if( pCons->z==0
cb80: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e   ){.        pCon
cb90: 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  s = pEnd;.      
cba0: 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20  }.      nName = 
cbb0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43  (const char *)pC
cbc0: 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 3b 0a  ons->z - zName;.
cbd0: 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f        p->addColO
cbe0: 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c  ffset = 13 + sql
cbf0: 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28  ite3Utf8CharLen(
cc00: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
cc10: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
cc20: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
cc30: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
cc40: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
cc50: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
cc60: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
cc70: 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f  te a new VIEW.*/
cc80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
cc90: 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
cca0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
ccb0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
ccc0: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
ccd0: 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
cce0: 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
ccf0: 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
cd00: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
cd10: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
cd20: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
cd30: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
cd40: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
cd50: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
cd60: 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e2,     /* The t
cd70: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
cd80: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
cd90: 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74  view */.  Select
cda0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20   *pSelect,   /* 
cdb0: 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  A SELECT stateme
cdc0: 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  nt that will bec
cdd0: 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77  ome the new view
cde0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
cdf0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45  ,        /* TRUE
ce00: 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59   for a TEMPORARY
ce10: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e   view */.  int n
ce20: 6f 45 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a  oErr          /*
ce30: 20 53 75 70 70 72 65 73 73 20 65 72 72 6f 72 20   Suppress error 
ce40: 6d 65 73 73 61 67 65 73 20 69 66 20 56 49 45 57  messages if VIEW
ce50: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
ce60: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
ce70: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  ;.  int n;.  con
ce80: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
ce90: 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
cea0: 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
ceb0: 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
cec0: 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  e;.  int iDb;.  
ced0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
cee0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
cef0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20   pParse->nVar>0 
cf00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
cf10: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
cf20: 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e  parameters are n
cf30: 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69  ot allowed in vi
cf40: 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ews");.    sqlit
cf50: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
cf60: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b, pSelect);.   
cf70: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
cf80: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
cf90: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
cfa0: 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c   pName2, isTemp,
cfb0: 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20   1, 0, noErr);. 
cfc0: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
cfd0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
cfe0: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
cff0: 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
d000: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
d010: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
d020: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
d030: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
d040: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
d050: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
d060: 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ;.  iDb = sqlite
d070: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
d080: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
d090: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
d0a0: 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72  Init(&sFix, pPar
d0b0: 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c  se, iDb, "view",
d0c0: 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73   pName).    && s
d0d0: 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28  qlite3FixSelect(
d0e0: 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a  &sFix, pSelect).
d0f0: 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
d100: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
d110: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72   pSelect);.    r
d120: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
d130: 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
d140: 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43  the entire SELEC
d150: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
d160: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
d170: 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c  w..  ** This wil
d180: 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20  l force all the 
d190: 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
d1a0: 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ues to be dynami
d1b0: 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  cally.  ** alloc
d1c0: 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  ated rather than
d1d0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e   point to the in
d1e0: 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69  put string - whi
d1f0: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  ch means that.  
d200: 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72  ** they will per
d210: 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63  sist after the c
d220: 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
d230: 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72  xec() call retur
d240: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53  ns..  */.  p->pS
d250: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
d260: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 65  electDup(db, pSe
d270: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
d280: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
d290: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28   pSelect);.  if(
d2a0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d2b0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
d2c0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 2d 3e  .  }.  if( !db->
d2d0: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
d2e0: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
d2f0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
d300: 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e, p);.  }..  /*
d310: 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20   Locate the end 
d320: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49  of the CREATE VI
d330: 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d  EW statement.  M
d340: 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74  ake sEnd point t
d350: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a  o.  ** the end..
d360: 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50    */.  sEnd = pP
d370: 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
d380: 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30  ;.  if( sEnd.z[0
d390: 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30  ]!=0 && sEnd.z[0
d3a0: 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45  ]!=';' ){.    sE
d3b0: 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a  nd.z += sEnd.n;.
d3c0: 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30    }.  sEnd.n = 0
d3d0: 3b 0a 20 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d  ;.  n = sEnd.z -
d3e0: 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20   pBegin->z;.  z 
d3f0: 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
d400: 64 20 63 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e  d char*)pBegin->
d410: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  z;.  while( n>0 
d420: 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20  && (z[n-1]==';' 
d430: 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31  || isspace(z[n-1
d440: 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  ])) ){ n--; }.  
d450: 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
d460: 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
d470: 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65  .  /* Use sqlite
d480: 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  3EndTable() to a
d490: 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
d4a0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
d4b0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
d4c0: 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
d4d0: 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 29  se, 0, &sEnd, 0)
d4e0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
d4f0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d500: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66  MIT_VIEW */..#if
d510: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d520: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
d530: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
d540: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
d550: 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  )./*.** The Tabl
d560: 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62  e structure pTab
d570: 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56  le is really a V
d580: 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68  IEW.  Fill in th
d590: 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  e names of.** th
d5a0: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
d5b0: 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61   view in the pTa
d5c0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ble structure.  
d5d0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
d5e0: 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20  r.** of errors. 
d5f0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
d600: 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72  seen leave an er
d610: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
d620: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
d630: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69  */.int sqlite3Vi
d640: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
d650: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
d660: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
d670: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
d680: 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61  ;   /* A fake ta
d690: 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77  ble from which w
d6a0: 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74  e get the result
d6b0: 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74   set */.  Select
d6c0: 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43   *pSel;     /* C
d6d0: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
d6e0: 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  T that implement
d6f0: 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  s the view */.  
d700: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20  int nErr = 0;   
d710: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
d720: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
d730: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
d740: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
d750: 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68  orarily holds th
d760: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  e number of curs
d770: 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a  ors assigned */.
d780: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d790: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
d7a0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
d7b0: 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65  ion for malloc e
d7c0: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28  rrors */.  int (
d7d0: 2a 78 41 75 74 68 29 28 76 6f 69 64 2a 2c 69 6e  *xAuth)(void*,in
d7e0: 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  t,const char*,co
d7f0: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
d800: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
d810: 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *);..  assert( p
d820: 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65  Table );..#ifnde
d830: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
d840: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
d850: 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
d860: 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20  Connect(pParse, 
d870: 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72  pTable) ){.    r
d880: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
d890: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73  OR;.  }.  if( Is
d8a0: 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20  Virtual(pTable) 
d8b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
d8c0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
d8d0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
d8e0: 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f  * A positive nCo
d8f0: 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75  l means the colu
d900: 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  mns names for th
d910: 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a  is view are.  **
d920: 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a   already known..
d930: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
d940: 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75  e->nCol>0 ) retu
d950: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65  rn 0;..  /* A ne
d960: 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61  gative nCol is a
d970: 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20   special marker 
d980: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20  meaning that we 
d990: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
d9a0: 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d  ** trying to com
d9b0: 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
d9c0: 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e  names.  If we en
d9d0: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
d9e0: 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67   with.  ** a neg
d9f0: 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d  ative nCol, it m
da00: 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65  eans two or more
da10: 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f   views form a lo
da20: 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  op, like this:. 
da30: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45   **.  **     CRE
da40: 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20  ATE VIEW one AS 
da50: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77  SELECT * FROM tw
da60: 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  o;.  **     CREA
da70: 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53  TE VIEW two AS S
da80: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65  ELECT * FROM one
da90: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ;.  **.  ** Actu
daa0: 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72  ally, this error
dab0: 20 69 73 20 63 61 75 67 68 74 20 70 72 65 76 69   is caught previ
dac0: 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65  ously and so the
dad0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a   following test.
dae0: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61    ** should alwa
daf0: 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65  ys fail.  But we
db00: 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69   will leave it i
db10: 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20  n place just to 
db20: 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20  be safe..  */.  
db30: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
db40: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
db50: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
db60: 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
db70: 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
db80: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
db90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
dba0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
dbb0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29  Table->nCol>=0 )
dbc0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
dbd0: 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
dbe0: 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
dbf0: 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c  compute the tabl
dc00: 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f  e names..  ** No
dc10: 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  te that the call
dc20: 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c   to sqlite3Resul
dc30: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
dc40: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
dc50: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
dc60: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20   in the results 
dc70: 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20  set of the view 
dc80: 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20  and will assign 
dc90: 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20  cursors.  ** to 
dca0: 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
dcb0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
dcc0: 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20    But we do not 
dcd0: 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67  want these chang
dce0: 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65  es.  ** to be pe
dcf0: 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65  rmanent.  So the
dd00: 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
dd10: 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f  done on a copy o
dd20: 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a  f the SELECT.  *
dd30: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  * statement that
dd40: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
dd50: 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
dd60: 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
dd70: 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71  t );.  pSel = sq
dd80: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
dd90: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
dda0: 63 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20  ct);.  if( pSel 
ddb0: 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73  ){.    n = pPars
ddc0: 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c  e->nTab;.    sql
ddd0: 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
dde0: 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
ddf0: 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20   pSel->pSrc);.  
de00: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
de10: 20 2d 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   -1;.#ifndef SQL
de20: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
de30: 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68  ZATION.    xAuth
de40: 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20   = db->xAuth;.  
de50: 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b    db->xAuth = 0;
de60: 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73  .    pSelTab = s
de70: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
de80: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
de90: 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78  pSel);.    db->x
dea0: 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65  Auth = xAuth;.#e
deb0: 6c 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20  lse.    pSelTab 
dec0: 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
ded0: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
dee0: 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66  e, pSel);.#endif
def0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  .    pParse->nTa
df00: 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70  b = n;.    if( p
df10: 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20  SelTab ){.      
df20: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
df30: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
df40: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
df50: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
df60: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
df70: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
df80: 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
df90: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
dfa0: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
dfb0: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
dfc0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53  e3DeleteTable(pS
dfd0: 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54  elTab);.      pT
dfe0: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 66  able->pSchema->f
dff0: 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73  lags |= DB_Unres
e000: 65 74 56 69 65 77 73 3b 0a 20 20 20 20 7d 65 6c  etViews;.    }el
e010: 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65  se{.      pTable
e020: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
e030: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a    nErr++;.    }.
e040: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
e050: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
e060: 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  );.  } else {.  
e070: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65    nErr++;.  }.#e
e080: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
e090: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65  MIT_VIEW */.  re
e0a0: 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23  turn nErr;  .}.#
e0b0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
e0c0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
e0d0: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
e0e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
e0f0: 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69  UALTABLE) */..#i
e100: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e110: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65  T_VIEW./*.** Cle
e120: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
e130: 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
e140: 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
e150: 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
e160: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
e170: 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  setAll(sqlite3 *
e180: 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  db, int idx){.  
e190: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69  HashElem *i;.  i
e1a0: 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  f( !DbHasPropert
e1b0: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
e1c0: 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65  resetViews) ) re
e1d0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
e1e0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
e1f0: 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68  b->aDb[idx].pSch
e200: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69  ema->tblHash); i
e210: 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  ;i=sqliteHashNex
e220: 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(i)){.    Table
e230: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
e240: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
e250: 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
e260: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
e270: 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  eResetColumnName
e280: 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  s(pTab);.    }. 
e290: 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70   }.  DbClearProp
e2a0: 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
e2b0: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
e2c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
e2d0: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
e2e0: 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20  All(A,B).#endif 
e2f0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
e300: 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  IEW */../*.** Th
e310: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
e320: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42  alled by the VDB
e330: 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  E to adjust the 
e340: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
e350: 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74  ** used by SQLit
e360: 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65  e when the btree
e370: 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74   layer moves a t
e380: 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20  able root page. 
e390: 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65  The.** root-page
e3a0: 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
e3b0: 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65  ndex in database
e3c0: 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64   iDb has changed
e3d0: 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74   from iFrom.** t
e3e0: 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63  o iTo..**.** Tic
e3f0: 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20  ket #1728:  The 
e400: 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67  symbol table mig
e410: 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  ht still contain
e420: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
e430: 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72  on tables and/or
e440: 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72   indices that ar
e450: 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66  e the process of
e460: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a   being deleted..
e470: 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e  ** If you are un
e480: 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68  lucky, one of th
e490: 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69  ose deleted indi
e4a0: 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69  ces or tables mi
e4b0: 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20  ght.** have the 
e4c0: 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75  same rootpage nu
e4d0: 6d 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c  mber as the real
e4e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
e4f0: 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67  that is.** being
e500: 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63   moved.  So we c
e510: 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63  annot stop searc
e520: 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66  hing after the f
e530: 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62  irst match .** b
e540: 65 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74  ecause the first
e550: 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20   match might be 
e560: 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64  for one of the d
e570: 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a  eleted indices.*
e580: 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20  * or tables and 
e590: 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e  not the table/in
e5a0: 64 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75  dex that is actu
e5b0: 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64  ally being moved
e5c0: 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e  ..** We must con
e5d0: 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e  tinue looping un
e5e0: 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61  til all tables a
e5f0: 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a  nd indices with.
e600: 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72  ** rootpage==iFr
e610: 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e  om have been con
e620: 76 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61  verted to have a
e630: 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f   rootpage of iTo
e640: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
e650: 62 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  be certain that 
e660: 77 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74  we got the right
e670: 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   one..*/.#ifndef
e680: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
e690: 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c  OVACUUM.void sql
e6a0: 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65  ite3RootPageMove
e6b0: 64 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69  d(Db *pDb, int i
e6c0: 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
e6d0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
e6e0: 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68  m;.  Hash *pHash
e6f0: 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44  ;..  pHash = &pD
e700: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
e710: 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ash;.  for(pElem
e720: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
e730: 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  (pHash); pElem; 
e740: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
e750: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
e760: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
e770: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
e780: 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
e790: 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Tab->tnum==iFrom
e7a0: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
e7b0: 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
e7c0: 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20  }.  }.  pHash = 
e7d0: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  &pDb->pSchema->i
e7e0: 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  dxHash;.  for(pE
e7f0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
e800: 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
e810: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
e820: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
e830: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
e840: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
e850: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
e860: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pIdx->tnum==iF
e870: 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64  rom ){.      pId
e880: 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  x->tnum = iTo;. 
e890: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
e8a0: 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63  f../*.** Write c
e8b0: 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65  ode to erase the
e8c0: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
e8d0: 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f  -page iTable fro
e8e0: 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a  m database iDb..
e8f0: 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f  ** Also write co
e900: 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  de to modify the
e910: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
e920: 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61  able and interna
e930: 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61  l schema.** if a
e940: 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e   root-page of an
e950: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
e960: 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
e970: 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a  e-layer whilst.*
e980: 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65  * erasing iTable
e990: 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
e9a0: 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
e9b0: 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
e9c0: 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
e9d0: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
e9e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
e9f0: 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20  int iTable, int 
ea00: 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
ea10: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
ea20: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
ea30: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
ea40: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
ea50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ea60: 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  Op3(v, OP_Destro
ea70: 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69  y, iTable, r1, i
ea80: 44 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Db);.#ifndef SQL
ea90: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
eaa0: 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74  UUM.  /* OP_Dest
eab0: 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e  roy stores an in
eac0: 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20   integer r1. If 
ead0: 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a  this integer.  *
eae0: 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  * is non-zero, t
eaf0: 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f  hen it is the ro
eb00: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
eb10: 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20  f a table moved 
eb20: 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e  to.  ** location
eb30: 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c   iTable. The fol
eb40: 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69  lowing code modi
eb50: 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f  fies the sqlite_
eb60: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a  master table to.
eb70: 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69    ** reflect thi
eb80: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
eb90: 20 22 23 25 64 22 20 69 6e 20 74 68 65 20 53 51   "#%d" in the SQ
eba0: 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63  L is a special c
ebb0: 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61  onstant that mea
ebc0: 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75  ns whatever valu
ebd0: 65 0a 20 20 2a 2a 20 69 73 20 6f 6e 20 74 68 65  e.  ** is on the
ebe0: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
ebf0: 6b 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 52  k.  See sqlite3R
ec00: 65 67 69 73 74 65 72 45 78 70 72 28 29 2e 0a 20  egisterExpr().. 
ec10: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
ec20: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
ec30: 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20 25   .     "UPDATE %
ec40: 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67  Q.%s SET rootpag
ec50: 65 3d 25 64 20 57 48 45 52 45 20 23 25 64 20 41  e=%d WHERE #%d A
ec60: 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 22  ND rootpage=#%d"
ec70: 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ,.     pParse->d
ec80: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
ec90: 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
eca0: 69 44 62 29 2c 20 69 54 61 62 6c 65 2c 20 72 31  iDb), iTable, r1
ecb0: 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  , r1);.#endif.  
ecc0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
ecd0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
ece0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  );.}../*.** Writ
ecf0: 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65  e VDBE code to e
ed00: 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20  rase table pTab 
ed10: 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74  and all associat
ed20: 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69  ed indices on di
ed30: 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75  sk..** Code to u
ed40: 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  pdate the sqlite
ed50: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61  _master tables a
ed60: 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
ed70: 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a  ma definitions.*
ed80: 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74  * in case a root
ed90: 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20  -page belonging 
eda0: 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  to another table
edb0: 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65   is moved by the
edc0: 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20   btree layer.** 
edd0: 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74  is also added (t
ede0: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
edf0: 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
ee00: 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
ee10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
ee20: 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20  troyTable(Parse 
ee30: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
ee40: 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51  pTab){.#ifdef SQ
ee50: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
ee60: 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49  CUUM.  Index *pI
ee70: 64 78 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20  dx;.  int iDb = 
ee80: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
ee90: 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
eea0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
eeb0: 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61  .  destroyRootPa
eec0: 67 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  ge(pParse, pTab-
eed0: 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66  >tnum, iDb);.  f
eee0: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
eef0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
ef00: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
ef10: 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
ef20: 67 65 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  ge(pParse, pIdx-
ef30: 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d  >tnum, iDb);.  }
ef40: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74  .#else.  /* If t
ef50: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
ef60: 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  be auto-vacuum c
ef70: 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54  apable (if SQLIT
ef80: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
ef90: 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65  M.  ** is not de
efa0: 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20  fined), then it 
efb0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
efc0: 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20  call OP_Destroy 
efd0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c  on the.  ** tabl
efe0: 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74  e and index root
eff0: 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c  -pages in order,
f000: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74   starting with t
f010: 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a  he numerically .
f020: 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f    ** largest roo
f030: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54  t-page number. T
f040: 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74  his guarantees t
f050: 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hat none of the 
f060: 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20  root-pages.  ** 
f070: 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  to be destroyed 
f080: 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20  is relocated by 
f090: 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65  an earlier OP_De
f0a0: 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74  stroy. i.e. if t
f0b0: 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  he.  ** followin
f0c0: 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20  g were coded:.  
f0d0: 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  **.  ** OP_Destr
f0e0: 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a  oy 4 0.  ** ....
f0f0: 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
f100: 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e  5 0.  **.  ** an
f110: 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61  d root page 5 ha
f120: 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65  ppened to be the
f130: 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
f140: 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ge number in the
f150: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
f160: 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35  then root page 5
f170: 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20   would be moved 
f180: 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68 65  to page 4 by the
f190: 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72   .  ** "OP_Destr
f1a0: 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20  oy 4 0" opcode. 
f1b0: 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 22  The subsequent "
f1c0: 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20  OP_Destroy 5 0" 
f1d0: 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61  would hit.  ** a
f1e0: 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e   free-list page.
f1f0: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  .  */.  int iTab
f200: 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20   = pTab->tnum;. 
f210: 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20   int iDestroyed 
f220: 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31  = 0;..  while( 1
f230: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
f240: 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61  Idx;.    int iLa
f250: 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20  rgest = 0;..    
f260: 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d  if( iDestroyed==
f270: 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72  0 || iTab<iDestr
f280: 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c  oyed ){.      iL
f290: 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20  argest = iTab;. 
f2a0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64     }.    for(pId
f2b0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
f2c0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
f2d0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
f2e0: 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e  nt iIdx = pIdx->
f2f0: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  tnum;.      asse
f300: 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d  rt( pIdx->pSchem
f310: 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
f320: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
f330: 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20  Destroyed==0 || 
f340: 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64  (iIdx<iDestroyed
f350: 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67  )) && iIdx>iLarg
f360: 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  est ){.        i
f370: 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a  Largest = iIdx;.
f380: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f390: 20 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d    if( iLargest==
f3a0: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
f3b0: 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  n;.    }else{.  
f3c0: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
f3d0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
f3e0: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
f3f0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
f400: 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74       destroyRoot
f410: 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61  Page(pParse, iLa
f420: 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20  rgest, iDb);.   
f430: 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20     iDestroyed = 
f440: 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a  iLargest;.    }.
f450: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
f460: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f470: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f   is called to do
f480: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44   the work of a D
f490: 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ROP TABLE statem
f4a0: 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73  ent..** pName is
f4b0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
f4c0: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f   table to be dro
f4d0: 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pped..*/.void sq
f4e0: 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50  lite3DropTable(P
f4f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
f500: 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
f510: 74 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f  t isView, int no
f520: 45 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  Err){.  Table *p
f530: 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  Tab;.  Vdbe *v;.
f540: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
f550: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
f560: 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50  t iDb;..  if( pP
f570: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
f580: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f590: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
f5a0: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
f5b0: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
f5c0: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54  >nSrc==1 );.  pT
f5d0: 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
f5e0: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
f5f0: 69 73 56 69 65 77 2c 20 0a 20 20 20 20 20 20 20  isView, .       
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f610: 20 20 20 20 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d       pName->a[0]
f620: 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
f630: 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
f640: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
f650: 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20  {.    if( noErr 
f660: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f670: 45 72 72 6f 72 43 6c 65 61 72 28 70 50 61 72 73  ErrorClear(pPars
f680: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  e);.    }.    go
f690: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
f6a0: 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  le;.  }.  iDb = 
f6b0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
f6c0: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
f6d0: 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72  Schema);.  asser
f6e0: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
f6f0: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f  <db->nDb );..  /
f700: 2a 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76  * If pTab is a v
f710: 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61  irtual table, ca
f720: 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  ll ViewGetColumn
f730: 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72  Names() to ensur
f740: 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69  e.  ** it is ini
f750: 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
f760: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
f770: 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56  Tab) && sqlite3V
f780: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
f790: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
f7a0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
f7b0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
f7c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f7d0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
f7e0: 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
f7f0: 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ode;.    const c
f800: 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
f810: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
f820: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f830: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
f840: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
f850: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d  st char *zArg2 =
f860: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
f870: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
f880: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
f890: 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
f8a0: 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  )){.      goto e
f8b0: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
f8c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
f8d0: 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  View ){.      if
f8e0: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
f8f0: 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
f900: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
f910: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57  E_DROP_TEMP_VIEW
f920: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f930: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
f940: 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a  LITE_DROP_VIEW;.
f950: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
f960: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
f970: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c  UALTABLE.    }el
f980: 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  se if( IsVirtual
f990: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
f9a0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
f9b0: 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20  OP_VTABLE;.     
f9c0: 20 7a 41 72 67 32 20 3d 20 70 54 61 62 2d 3e 70   zArg2 = pTab->p
f9d0: 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64  Mod->zName;.#end
f9e0: 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
f9f0: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
fa00: 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
fa10: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
fa20: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
fa30: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
fa40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
fa50: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
fa60: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
fa70: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
fa80: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
fa90: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61  Parse, code, pTa
faa0: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c  b->zName, zArg2,
fab0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
fac0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
fad0: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
fae0: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
faf0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
fb00: 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d  TE_DELETE, pTab-
fb10: 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20  >zName, 0, zDb) 
fb20: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
fb30: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
fb40: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
fb50: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
fb60: 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  NICmp(pTab->zNam
fb70: 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
fb80: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
fb90: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
fba0: 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
fbb0: 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
fbc0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
fbd0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
fbe0: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23  op_table;.  }..#
fbf0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fc00: 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73  IT_VIEW.  /* Ens
fc10: 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69  ure DROP TABLE i
fc20: 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20  s not used on a 
fc30: 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56  view, and DROP V
fc40: 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a  IEW is not used.
fc50: 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e    ** on a table.
fc60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69  .  */.  if( isVi
fc70: 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
fc80: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
fc90: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
fca0: 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
fcb0: 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
fcc0: 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d  table %s", pTab-
fcd0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
fce0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
fcf0: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  e;.  }.  if( !is
fd00: 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
fd10: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
fd20: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
fd30: 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56  rse, "use DROP V
fd40: 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69  IEW to delete vi
fd50: 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  ew %s", pTab->zN
fd60: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
fd70: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
fd80: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
fd90: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
fda0: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62  o remove the tab
fdb0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  le from the mast
fdc0: 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e  er table.  ** on
fdd0: 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20   disk..  */.  v 
fde0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
fdf0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
fe00: 76 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72  v ){.    Trigger
fe10: 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20   *pTrigger;.    
fe20: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
fe30: 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c  Db[iDb];.    sql
fe40: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
fe50: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
fe60: 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  1, iDb);..#ifnde
fe70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
fe80: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
fe90: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
fea0: 62 29 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65  b) ){.      Vdbe
feb0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
fec0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
fed0: 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20      if( v ){.   
fee0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fef0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
ff00: 67 69 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gin);.      }.  
ff10: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
ff20: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67  /* Drop all trig
ff30: 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  gers associated 
ff40: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62  with the table b
ff50: 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f  eing dropped. Co
ff60: 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e  de.    ** is gen
ff70: 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65  erated to remove
ff80: 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71   entries from sq
ff90: 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f  lite_master and/
ffa0: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
ffb0: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20  _temp_master if 
ffc0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
ffd0: 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
ffe0: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a  pTab->pTrigger;.
fff0: 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67      while( pTrig
10000 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ger ){.      ass
10010 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70  ert( pTrigger->p
10020 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
10030 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20  chema || .      
10040 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53      pTrigger->pS
10050 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
10060 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
10070 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
10080 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
10090 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20   pTrigger);.    
100a0 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72    pTrigger = pTr
100b0 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  igger->pNext;.  
100c0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
100d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
100e0 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65  REMENT.    /* Re
100f0 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73  move any entries
10100 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   of the sqlite_s
10110 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73  equence table as
10120 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20  sociated with.  
10130 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
10140 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68  eing dropped. Th
10150 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72  is is done befor
10160 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64  e the table is d
10170 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20 61 74  ropped.    ** at
10180 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c   the btree level
10190 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71  , in case the sq
101a0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
101b0 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ble needs to.   
101c0 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65   ** move as a re
101d0 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70  sult of the drop
101e0 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20   (can happen in 
101f0 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
10200 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
10210 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
10220 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
10230 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ent ){.      sql
10240 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
10250 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
10260 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e  "DELETE FROM %s.
10270 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
10280 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
10290 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
102a0 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a  me, pTab->zName.
102b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23        );.    }.#
102c0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72  endif..    /* Dr
102d0 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
102e0 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69  STER table and i
102f0 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61  ndex entries tha
10300 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20  t refer to the. 
10310 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65     ** table. The
10320 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f   program name lo
10330 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ops through the 
10340 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
10350 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20   deletes.    ** 
10360 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72  every row that r
10370 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
10380 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
10390 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69  e as the one bei
103a0 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65  ng.    ** droppe
103b0 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20  d. Triggers are 
103c0 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65  handled seperate
103d0 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69  ly because a tri
103e0 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20  gger can be.    
103f0 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ** created in th
10400 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
10410 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
10420 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65   table in anothe
10430 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  r.    ** databas
10440 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
10450 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
10460 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
10470 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
10480 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e  Q.%s WHERE tbl_n
10490 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21  ame=%Q and type!
104a0 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20  ='trigger'",.   
104b0 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c       pDb->zName,
104c0 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
104d0 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  b), pTab->zName)
104e0 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61  ;..    /* Drop a
104f0 6e 79 20 73 74 61 74 69 73 74 69 63 73 20 66 72  ny statistics fr
10500 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  om the sqlite_st
10510 61 74 31 20 74 61 62 6c 65 2c 20 69 66 20 69 74  at1 table, if it
10520 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69   exists */.    i
10530 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
10540 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ble(db, "sqlite_
10550 73 74 61 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b  stat1", db->aDb[
10560 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20  iDb].zName) ){. 
10570 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
10580 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
10590 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
105a0 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
105b0 74 61 74 31 20 57 48 45 52 45 20 74 62 6c 3d 25  tat1 WHERE tbl=%
105c0 51 22 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20  Q", pDb->zName, 
105d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
105e0 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
105f0 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21  if( !isView && !
10600 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
10610 29 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  ){.      destroy
10620 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
10630 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ab);.    }..    
10640 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61  /* Remove the ta
10650 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53  ble entry from S
10660 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c  QLite's internal
10670 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69   schema and modi
10680 66 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63  fy.    ** the sc
10690 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20  hema cookie..   
106a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 73 56 69   */.    if( IsVi
106b0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
106c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
106d0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65  AddOp4(v, OP_VDe
106e0 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30  stroy, iDb, 0, 0
106f0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
10700 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
10710 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
10720 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20  , OP_DropTable, 
10730 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  iDb, 0, 0, pTab-
10740 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
10750 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
10760 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
10770 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69  ;.  }.  sqliteVi
10780 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69  ewResetAll(db, i
10790 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  Db);..exit_drop_
107a0 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33  table:.  sqlite3
107b0 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
107c0 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , pName);.}../*.
107d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
107e0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  is called to cre
107f0 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67  ate a new foreig
10800 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62  n key on the tab
10810 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  le.** currently 
10820 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
10830 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65  on.  pFromCol de
10840 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63  termines which c
10850 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
10860 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70   current table p
10870 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65  oint to the fore
10880 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72  ign key.  If pFr
10890 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a  omCol==0 then.**
108a0 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79   connect the key
108b0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   to the last col
108c0 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70  umn inserted.  p
108d0 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  To is the name o
108e0 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72  f.** the table r
108f0 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f  eferred to.  pTo
10900 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66  Col is a list of
10910 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f   tables in the o
10920 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c  ther.** pTo tabl
10930 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69  e that the forei
10940 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f  gn key points to
10950 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e  .  flags contain
10960 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  s all.** informa
10970 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
10980 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
10990 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70  on algorithms sp
109a0 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68  ecified.** in th
109b0 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20  e ON DELETE, ON 
109c0 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e  UPDATE and ON IN
109d0 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SERT clauses..**
109e0 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75  .** An FKey stru
109f0 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
10a00 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
10a10 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
10a20 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74  y.** under const
10a30 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ruction in the p
10a40 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
10a50 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77   field.  The new
10a60 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20   FKey.** is not 
10a70 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e  linked into db->
10a80 61 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f  aFKey at this po
10a90 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20  int - that does 
10aa0 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e  not happen.** un
10ab0 74 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61  til sqlite3EndTa
10ac0 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ble()..**.** The
10ad0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
10ae0 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
10af0 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
10b00 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
10b10 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
10b20 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
10b30 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
10b40 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
10b50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
10b60 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
10b70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10b80 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
10b90 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
10ba0 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
10bb0 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
10bc0 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
10bd0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
10be0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
10bf0 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
10c00 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
10c10 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
10c20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
10c30 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
10c40 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
10c50 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
10c60 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
10c70 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
10c80 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
10c90 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
10ca0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10cb0 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
10cc0 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
10cd0 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
10ce0 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70   = 0;.  Table *p
10cf0 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
10d00 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74  able;.  int nByt
10d10 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
10d20 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  t nCol;.  char *
10d30 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  z;..  assert( pT
10d40 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  o!=0 );.  if( p=
10d50 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
10d60 72 72 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  rr || IN_DECLARE
10d70 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f  _VTAB ) goto fk_
10d80 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  end;.  if( pFrom
10d90 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Col==0 ){.    in
10da0 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  t iCol = p->nCol
10db0 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  -1;.    if( iCol
10dc0 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  <0 ) goto fk_end
10dd0 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c  ;.    if( pToCol
10de0 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
10df0 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  r!=1 ){.      sq
10e00 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
10e10 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b  arse, "foreign k
10e20 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20  ey on %s".      
10e30 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65     " should refe
10e40 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63  rence only one c
10e50 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25  olumn of table %
10e60 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  T",.         p->
10e70 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
10e80 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f  , pTo);.      go
10e90 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d  to fk_end;.    }
10ea0 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20  .    nCol = 1;. 
10eb0 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f   }else if( pToCo
10ec0 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
10ed0 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  pr!=pFromCol->nE
10ee0 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
10ef0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10f00 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62  e,.        "numb
10f10 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
10f20 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
10f30 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
10f40 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20  number of ".    
10f50 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20      "columns in 
10f60 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
10f70 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f  able");.    goto
10f80 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65   fk_end;.  }else
10f90 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72  {.    nCol = pFr
10fa0 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20  omCol->nExpr;.  
10fb0 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  }.  nByte = size
10fc0 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f  of(*pFKey) + nCo
10fd0 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  l*sizeof(pFKey->
10fe0 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
10ff0 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
11000 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
11010 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45  =0; i<pToCol->nE
11020 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
11030 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e   nByte += strlen
11040 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
11050 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  ame) + 1;.    }.
11060 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71    }.  pFKey = sq
11070 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
11080 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  o(db, nByte );. 
11090 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b   if( pFKey==0 ){
110a0 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
110b0 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70  ;.  }.  pFKey->p
110c0 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65  From = p;.  pFKe
110d0 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70  y->pNextFrom = p
110e0 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28  ->pFKey;.  z = (
110f0 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b  char*)&pFKey[1];
11100 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d  .  pFKey->aCol =
11110 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70   (struct sColMap
11120 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65  *)z;.  z += size
11130 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61  of(struct sColMa
11140 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79  p)*nCol;.  pFKey
11150 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d  ->zTo = z;.  mem
11160 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70  cpy(z, pTo->z, p
11170 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d  To->n);.  z[pTo-
11180 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20  >n] = 0;.  z += 
11190 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65  pTo->n+1;.  pFKe
111a0 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a  y->pNextTo = 0;.
111b0 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20    pFKey->nCol = 
111c0 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f  nCol;.  if( pFro
111d0 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mCol==0 ){.    p
111e0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46  FKey->aCol[0].iF
111f0 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  rom = p->nCol-1;
11200 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
11210 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
11220 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
11230 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
11240 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29   j<p->nCol; j++)
11250 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
11260 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e  lite3StrICmp(p->
11270 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[j].zName, p
11280 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
11290 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
112a0 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
112b0 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20  [i].iFrom = j;. 
112c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
112d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
112e0 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70  }.      if( j>=p
112f0 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
11300 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11310 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
11320 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f       "unknown co
11330 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66  lumn \"%s\" in f
11340 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
11350 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20  ition", .       
11360 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69     pFromCol->a[i
11370 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
11380 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
11390 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
113a0 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
113b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
113c0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
113d0 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
113e0 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
113f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65  ame);.      pFKe
11400 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20  y->aCol[i].zCol 
11410 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  = z;.      memcp
11420 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69  y(z, pToCol->a[i
11430 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ].zName, n);.   
11440 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20     z[n] = 0;.   
11450 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20     z += n+1;.   
11460 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e   }.  }.  pFKey->
11470 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a  isDeferred = 0;.
11480 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43    pFKey->deleteC
11490 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78  onf = flags & 0x
114a0 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64  ff;.  pFKey->upd
114b0 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73  ateConf = (flags
114c0 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a   >> 8 ) & 0xff;.
114d0 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43    pFKey->insertC
114e0 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20  onf = (flags >> 
114f0 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20  16 ) & 0xff;..  
11500 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65  /* Link the fore
11510 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74  ign key to the t
11520 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74  able as the last
11530 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d   step..  */.  p-
11540 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a  >pFKey = pFKey;.
11550 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b    pFKey = 0;..fk
11560 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44  _end:.  sqlite3D
11570 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29  bFree(db, pFKey)
11580 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ;.#endif /* !def
11590 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
115a0 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f  _FOREIGN_KEY) */
115b0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
115c0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72  stDelete(db, pFr
115d0 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  omCol);.  sqlite
115e0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
115f0 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a  db, pToCol);.}..
11600 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11610 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
11620 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49  n an INITIALLY I
11630 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54  MMEDIATE or INIT
11640 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a  IALLY DEFERRED.*
11650 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e  * clause is seen
11660 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f   as part of a fo
11670 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
11680 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66  tion.  The isDef
11690 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74  erred.** paramet
116a0 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54  er is 1 for INIT
116b0 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61  IALLY DEFERRED a
116c0 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c  nd 0 for INITIAL
116d0 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a  LY IMMEDIATE..**
116e0 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   The behavior of
116f0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
11700 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69  ly created forei
11710 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74  gn key is adjust
11720 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c  ed.** accordingl
11730 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
11740 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
11750 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
11760 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29   int isDeferred)
11770 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
11780 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
11790 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  Y.  Table *pTab;
117a0 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a  .  FKey *pFKey;.
117b0 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50    if( (pTab = pP
117c0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
117d0 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20  ==0 || (pFKey = 
117e0 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20  pTab->pFKey)==0 
117f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65  ) return;.  pFKe
11800 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
11810 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64  isDeferred;.#end
11820 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  if.}../*.** Gene
11830 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
11840 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65  ill erase and re
11850 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78  fill index *pIdx
11860 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73  .  This is.** us
11870 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
11880 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64   a newly created
11890 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63   index or to rec
118a0 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f  ompute the.** co
118b0 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65  ntent of an inde
118c0 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f  x in response to
118d0 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61   a REINDEX comma
118e0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d  nd..**.** if mem
118f0 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20  RootPage is not 
11900 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61  negative, it mea
11910 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ns that the inde
11920 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72  x is newly.** cr
11930 65 61 74 65 64 2e 20 20 54 68 65 20 72 65 67 69  eated.  The regi
11940 73 74 65 72 20 73 70 65 63 69 66 69 65 64 20 62  ster specified b
11950 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f  y memRootPage co
11960 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f  ntains the.** ro
11970 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
11980 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66  f the index.  If
11990 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
119a0 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a  negative, then.*
119b0 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  * the index alre
119c0 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d  ady exists and m
119d0 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62  ust be cleared b
119e0 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69  efore being refi
119f0 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20  lled and.** the 
11a00 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
11a10 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
11a20 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64   taken from pInd
11a30 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61  ex->tnum..*/.sta
11a40 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
11a50 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73  RefillIndex(Pars
11a60 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
11a70 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65   *pIndex, int me
11a80 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61  mRootPage){.  Ta
11a90 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
11aa0 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20  ex->pTable;  /* 
11ab0 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  The table that i
11ac0 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  s indexed */.  i
11ad0 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  nt iTab = pParse
11ae0 2d 3e 6e 54 61 62 3b 20 20 20 20 20 20 20 2f 2a  ->nTab;       /*
11af0 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
11b00 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  ed for pTab */. 
11b10 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72   int iIdx = pPar
11b20 73 65 2d 3e 6e 54 61 62 2b 31 3b 20 20 20 20 20  se->nTab+1;     
11b30 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
11b40 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20  used for pIndex 
11b50 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
11b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b70 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
11b80 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f  f top of loop */
11b90 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20  .  int tnum;    
11ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bb0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
11bc0 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  f index */.  Vdb
11bd0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
11be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
11bf0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
11c00 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  o this virtual m
11c10 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49  achine */.  KeyI
11c20 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20  nfo *pKey;      
11c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
11c40 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20  yInfo for index 
11c50 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49 64 78 4b  */.  int regIdxK
11c60 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
11c70 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
11c80 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
11c90 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69  index key */.  i
11ca0 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20  nt regRecord;   
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11cc0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
11cd0 67 20 61 73 73 65 6d 62 6c 69 65 64 20 69 6e 64  g assemblied ind
11ce0 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73  ex record */.  s
11cf0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
11d00 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a  rse->db;      /*
11d10 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
11d20 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
11d30 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
11d40 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
11d50 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
11d60 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
11d70 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
11d80 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69  ATION.  if( sqli
11d90 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
11da0 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e  rse, SQLITE_REIN
11db0 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  DEX, pIndex->zNa
11dc0 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d  me, 0,.      db-
11dd0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20  >aDb[iDb].zName 
11de0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
11df0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
11e00 2a 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74  * Require a writ
11e10 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  e-lock on the ta
11e20 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  ble to perform t
11e30 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  his operation */
11e40 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c  .  sqlite3TableL
11e50 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
11e60 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20   pTab->tnum, 1, 
11e70 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
11e80 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
11e90 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
11ea0 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
11eb0 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50  ;.  if( memRootP
11ec0 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e  age>=0 ){.    tn
11ed0 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65  um = memRootPage
11ee0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
11ef0 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e  num = pIndex->tn
11f00 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  um;.    sqlite3V
11f10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11f20 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62  Clear, tnum, iDb
11f30 29 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20  );.  }.  pKey = 
11f40 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
11f50 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 6e 64  nfo(pParse, pInd
11f60 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ex);.  sqlite3Vd
11f70 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
11f80 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20  penWrite, iIdx, 
11f90 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20  tnum, iDb, .    
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fb0 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34  (char *)pKey, P4
11fc0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
11fd0 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74  );.  if( memRoot
11fe0 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73  Page>=0 ){.    s
11ff0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
12000 50 35 28 76 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  P5(v, 1);.  }.  
12010 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
12020 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69  (pParse, iTab, i
12030 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
12040 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20  nRead);.  addr1 
12050 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12060 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
12070 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 72 65  , iTab, 0);.  re
12080 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
12090 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
120a0 73 65 29 3b 0a 20 20 72 65 67 49 64 78 4b 65 79  se);.  regIdxKey
120b0 20 3d 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61   = sqlite3Genera
120c0 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73  teIndexKey(pPars
120d0 65 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62 2c  e, pIndex, iTab,
120e0 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a   regRecord, 1);.
120f0 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e    if( pIndex->on
12100 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
12110 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32  {.    int j1, j2
12120 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77  ;.    int regRow
12130 69 64 3b 0a 0a 20 20 20 20 72 65 67 52 6f 77 69  id;..    regRowi
12140 64 20 3d 20 72 65 67 49 64 78 4b 65 79 20 2b 20  d = regIdxKey + 
12150 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
12160 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  .    j1 = sqlite
12170 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12180 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 49 64 78  P_IsNull, regIdx
12190 4b 65 79 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  Key, 0, pIndex->
121a0 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 6a 32  nColumn);.    j2
121b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
121c0 64 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69  dOp4(v, OP_IsUni
121d0 71 75 65 2c 20 69 49 64 78 2c 0a 20 20 20 20 20  que, iIdx,.     
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121f0 20 20 20 20 20 20 30 2c 20 72 65 67 52 6f 77 69        0, regRowi
12200 64 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  d, SQLITE_INT_TO
12210 5f 50 54 52 28 72 65 67 52 65 63 6f 72 64 29 2c  _PTR(regRecord),
12220 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
12230 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12240 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51  4(v, OP_Halt, SQ
12250 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
12260 20 4f 45 5f 41 62 6f 72 74 2c 20 30 2c 0a 20 20   OE_Abort, 0,.  
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d    "indexed colum
12290 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75  ns are not uniqu
122a0 65 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  e", P4_STATIC);.
122b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
122c0 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
122d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
122e0 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a  umpHere(v, j2);.
122f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
12300 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
12310 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72  xInsert, iIdx, r
12320 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
12330 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
12340 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
12350 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
12360 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12370 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
12380 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  r1+1);.  sqlite3
12390 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
123a0 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  addr1);.  sqlite
123b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
123c0 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a  P_Close, iTab);.
123d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
123e0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
123f0 20 69 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iIdx);.}../*.**
12400 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
12410 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
12420 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e  able.  pName1.pN
12430 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65  ame2 is the name
12440 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
12450 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69  * and pTblList i
12460 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
12470 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
12480 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
12490 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
124a0 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
124b0 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
124c0 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
124d0 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
124e0 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
124f0 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
12500 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
12510 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
12520 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
12530 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
12540 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
12550 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
12560 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
12570 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
12580 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
12590 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
125a0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
125b0 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
125c0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
125d0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
125e0 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
125f0 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
12600 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
12610 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
12620 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
12630 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
12640 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
12650 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
12660 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
12670 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
12680 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20  e3CreateIndex(. 
12690 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
126a0 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72      /* All infor
126b0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
126c0 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b  s parse */.  Tok
126d0 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
126e0 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
126f0 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
12700 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   be NULL */.  To
12710 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
12720 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
12730 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
12740 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
12750 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d  SrcList *pTblNam
12760 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69  e, /* Table to i
12770 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65  ndex. Use pParse
12780 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
12790 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
127a0 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
127b0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
127c0 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
127d0 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
127e0 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c      /* OE_Abort,
127f0 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52   OE_Ignore, OE_R
12800 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f  eplace, or OE_No
12810 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ne */.  Token *p
12820 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68  Start,     /* Th
12830 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
12840 68 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20  hat begins this 
12850 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
12860 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20  oken *pEnd,     
12870 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
12880 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
12890 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
128a0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
128b0 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
128c0 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
128d0 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
128e0 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
128f0 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20  nt ifNotExist   
12900 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
12910 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
12920 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
12930 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
12940 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
12950 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
12960 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
12970 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64   0;   /* The ind
12980 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ex to be created
12990 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
129a0 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61  e = 0;     /* Na
129b0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
129c0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
129d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
129e0 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
129f0 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20  s in zName */.  
12a00 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65  int i, j;.  Toke
12a10 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20  n nullId;       
12a20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66   /* Fake token f
12a30 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c  or an empty ID l
12a40 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72  ist */.  DbFixer
12a50 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a   sFix;        /*
12a60 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
12a70 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
12a80 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
12a90 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20   sortOrderMask; 
12aa0 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20    /* 1 to honor 
12ab0 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20  DESC in index.  
12ac0 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a  0 to ignore. */.
12ad0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
12ae0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62  pParse->db;.  Db
12af0 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
12b00 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
12b10 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ic table contain
12b20 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20  ing the indexed 
12b30 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
12b40 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
12b50 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
12b60 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
12b70 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
12b80 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
12b90 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  ame = 0;    /* U
12ba0 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
12bb0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
12bc0 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75  create */.  stru
12bd0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
12be0 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20   *pListItem; /* 
12bf0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
12c00 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
12c10 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45 78 74  nCol;.  int nExt
12c20 72 61 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ra = 0;.  char *
12c30 7a 45 78 74 72 61 3b 0a 0a 20 20 69 66 28 20 70  zExtra;..  if( p
12c40 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
12c50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12c60 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
12c70 41 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  AB ){.    goto e
12c80 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12c90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
12ca0 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
12cb0 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
12cc0 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
12cd0 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
12ce0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
12cf0 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20  blName!=0 ){..  
12d00 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f    /* Use the two
12d10 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65  -part index name
12d20 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
12d30 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
12d40 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  ** to search for
12d50 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78   the table. 'Fix
12d60 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  ' the table name
12d70 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20   to this db.    
12d80 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e  ** before lookin
12d90 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a  g up the table..
12da0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
12db0 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61  t( pName1 && pNa
12dc0 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  me2 );.    iDb =
12dd0 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
12de0 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
12df0 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
12e00 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
12e10 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  <0 ) goto exit_c
12e20 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 23 69  reate_index;..#i
12e30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12e40 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20  T_TEMPDB.    /* 
12e50 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  If the index nam
12e60 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65  e was unqualifie
12e70 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  d, check if the 
12e80 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
12e90 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65   is a temp table
12ea0 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65  . If so, set the
12eb0 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20   database to 1. 
12ec0 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20  Do not do this. 
12ed0 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c     ** if initial
12ee0 69 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ising a database
12ef0 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a   schema..    */.
12f00 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
12f10 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
12f20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72  pTab = sqlite3Sr
12f30 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72  cListLookup(pPar
12f40 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  se, pTblName);. 
12f50 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 20       if( pName2 
12f60 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  && pName2->n==0 
12f70 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
12f80 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
12f90 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
12fa0 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b          iDb = 1;
12fb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
12fc0 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73  endif..    if( s
12fd0 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
12fe0 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
12ff0 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65  , "index", pName
13000 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c  ) &&.        sql
13010 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26  ite3FixSrcList(&
13020 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a  sFix, pTblName).
13030 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
13040 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73  Because the pars
13050 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54  er constructs pT
13060 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69  blName from a si
13070 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c  ngle identifier,
13080 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
13090 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20  3FixSrcList can 
130a0 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20  never fail. */. 
130b0 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
130c0 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
130d0 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
130e0 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ble(pParse, 0, p
130f0 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  TblName->a[0].zN
13100 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54  ame, .        pT
13110 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61  blName->a[0].zDa
13120 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28  tabase);.    if(
13130 20 21 70 54 61 62 20 7c 7c 20 64 62 2d 3e 6d 61   !pTab || db->ma
13140 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
13150 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13160 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
13170 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
13180 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
13190 68 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  hema );.  }else{
131a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
131b0 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  me==0 );.    pTa
131c0 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
131d0 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21  Table;.    if( !
131e0 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74  pTab ) goto exit
131f0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13200 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
13210 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
13220 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
13230 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64  ;.  }.  pDb = &d
13240 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
13250 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70  if( pTab==0 || p
13260 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
13270 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13280 6e 64 65 78 3b 0a 20 20 69 66 28 20 73 71 6c 69  ndex;.  if( sqli
13290 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62  te3StrNICmp(pTab
132a0 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  ->zName, "sqlite
132b0 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  _", 7)==0 ){.   
132c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
132d0 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
132e0 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
132f0 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
13300 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
13310 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13320 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
13330 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
13340 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
13350 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
13360 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13370 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
13380 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
13390 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
133a0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
133b0 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
133c0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
133d0 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56  LTABLE.  if( IsV
133e0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
133f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13400 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72  Msg(pParse, "vir
13410 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20  tual tables may 
13420 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
13430 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
13440 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13450 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
13460 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   ** Find the nam
13470 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
13480 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
13490 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
134a0 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64  another.  ** ind
134b0 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68  ex or table with
134c0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
134d0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65   .  **.  ** Exce
134e0 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72  ption:  If we ar
134f0 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61  e reading the na
13500 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74  mes of permanent
13510 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68   indices from th
13520 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
13530 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61  ster table (beca
13540 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  use some other p
13550 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74  rocess changed t
13560 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20  he schema) and. 
13570 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   ** one of the i
13580 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69  ndex names colli
13590 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d  des with the nam
135a0 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79  e of a temporary
135b0 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69   table or.  ** i
135c0 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69  ndex, then we wi
135d0 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70  ll continue to p
135e0 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65  rocess this inde
135f0 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  x..  **.  ** If 
13600 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  pName==0 it mean
13610 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20  s that we are.  
13620 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  ** dealing with 
13630 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
13640 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
13650 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  nt.  We have to 
13660 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20  invent our.  ** 
13670 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  own name..  */. 
13680 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
13690 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
136a0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
136b0 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, pName);.    i
136c0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
136d0 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
136e0 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65  pParse) ) goto e
136f0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13700 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
13710 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
13720 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13730 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
13740 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
13750 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
13760 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
13770 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
13780 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
13790 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
137a0 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  usy ){.      if(
137b0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
137c0 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
137d0 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69  arse) ) goto exi
137e0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
137f0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
13800 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
13810 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20  Name, 0)!=0 ){. 
13820 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
13830 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13840 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
13850 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25   a table named %
13860 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
13870 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
13880 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13890 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
138a0 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  ( sqlite3FindInd
138b0 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44  ex(db, zName, pD
138c0 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  b->zName)!=0 ){.
138d0 20 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74        if( !ifNot
138e0 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  Exist ){.       
138f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13900 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
13910 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %s already exist
13920 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
13930 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
13940 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13950 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
13960 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
13970 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20  Index *pLoop;.  
13980 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62    for(pLoop=pTab
13990 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70  ->pIndex, n=1; p
139a0 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
139b0 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d  p->pNext, n++){}
139c0 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
139d0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
139e0 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  "sqlite_autoinde
139f0 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e  x_%s_%d", pTab->
13a00 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69  zName, n);.    i
13a10 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
13a20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
13a30 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13a40 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
13a50 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61  ck for authoriza
13a60 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
13a70 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69  n index..  */.#i
13a80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13a90 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
13aa0 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68    {.    const ch
13ab0 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a  ar *zDb = pDb->z
13ac0 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
13ad0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
13ae0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
13af0 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
13b00 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29  LE(iDb), 0, zDb)
13b10 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
13b20 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13b30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
13b40 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
13b50 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d  DEX;.    if( !OM
13b60 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
13b70 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45  ==1 ) i = SQLITE
13b80 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
13b90 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
13ba0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
13bb0 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70  rse, i, zName, p
13bc0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
13bd0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
13be0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13bf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13c00 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73  if..  /* If pLis
13c10 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74  t==0, it means t
13c20 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
13c30 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61  called to make a
13c40 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65   primary.  ** ke
13c50 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73  y out of the las
13c60 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
13c70 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  o the table unde
13c80 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
13c90 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61    ** So create a
13ca0 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69   fake list to si
13cb0 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a  mulate this..  *
13cc0 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  /.  if( pList==0
13cd0 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a   ){.    nullId.z
13ce0 20 3d 20 28 75 38 2a 29 70 54 61 62 2d 3e 61 43   = (u8*)pTab->aC
13cf0 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d  ol[pTab->nCol-1]
13d00 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c  .zName;.    null
13d10 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63  Id.n = strlen((c
13d20 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a  har*)nullId.z);.
13d30 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
13d40 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
13d50 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  d(pParse, 0, 0, 
13d60 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66  &nullId);.    if
13d70 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
13d80 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13d90 64 65 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  dex;.    pList->
13da0 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
13db0 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a   sortOrder;.  }.
13dc0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
13dd0 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20   how many bytes 
13de0 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65 71  of space are req
13df0 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65  uired to store e
13e00 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73  xplicitly.  ** s
13e10 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69  pecified collati
13e20 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
13e30 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
13e40 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
13e50 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
13e60 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 43 6f  r *pExpr;.    Co
13e70 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
13e80 20 20 69 66 28 20 28 70 45 78 70 72 20 3d 20 70    if( (pExpr = p
13e90 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
13ea0 29 21 3d 30 20 26 26 20 28 70 43 6f 6c 6c 20 3d  )!=0 && (pColl =
13eb0 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 29 21 3d   pExpr->pColl)!=
13ec0 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72  0 ){.      nExtr
13ed0 61 20 2b 3d 20 28 31 20 2b 20 73 74 72 6c 65 6e  a += (1 + strlen
13ee0 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b  (pColl->zName));
13ef0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13f00 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20   .  ** Allocate 
13f10 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
13f20 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61  ure. .  */.  nNa
13f30 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  me = strlen(zNam
13f40 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69  e);.  nCol = pLi
13f50 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
13f60 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  dex = sqlite3DbM
13f70 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20  allocZero(db, . 
13f80 20 20 20 20 20 73 69 7a 65 6f 66 28 49 6e 64 65       sizeof(Inde
13f90 78 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  x) +            
13fa0 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63    /* Index struc
13fb0 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 73  ture  */.      s
13fc0 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 20  izeof(int)*nCol 
13fd0 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  +           /* I
13fe0 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20  ndex.aiColumn   
13ff0 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
14000 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20  int)*(nCol+1) + 
14010 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
14020 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20 20  iRowEst   */.   
14030 20 20 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a     sizeof(char *
14040 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
14050 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20  /* Index.azColl 
14060 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a      */.      siz
14070 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 20 2b 20 20  eof(u8)*nCol +  
14080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
14090 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f  ex.aSortOrder */
140a0 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 31  .      nName + 1
140b0 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
140c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61      /* Index.zNa
140d0 6d 65 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  me      */.     
140e0 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20   nExtra         
140f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14100 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
14110 6e 63 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 29  nce names */.  )
14120 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
14130 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
14140 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
14150 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49  _index;.  }.  pI
14160 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28  ndex->azColl = (
14170 63 68 61 72 2a 2a 29 28 26 70 49 6e 64 65 78 5b  char**)(&pIndex[
14180 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  1]);.  pIndex->a
14190 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20 2a  iColumn = (int *
141a0 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  )(&pIndex->azCol
141b0 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64  l[nCol]);.  pInd
141c0 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20 28  ex->aiRowEst = (
141d0 75 6e 73 69 67 6e 65 64 20 2a 29 28 26 70 49 6e  unsigned *)(&pIn
141e0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43  dex->aiColumn[nC
141f0 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ol]);.  pIndex->
14200 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
14210 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 52   *)(&pIndex->aiR
14220 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a  owEst[nCol+1]);.
14230 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
14240 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64  = (char *)(&pInd
14250 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  ex->aSortOrder[n
14260 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72 61 20  Col]);.  zExtra 
14270 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64  = (char *)(&pInd
14280 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b  ex->zName[nName+
14290 31 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49  1]);.  memcpy(pI
142a0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  ndex->zName, zNa
142b0 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20  me, nName+1);.  
142c0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d  pIndex->pTable =
142d0 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d   pTab;.  pIndex-
142e0 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74  >nColumn = pList
142f0 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65  ->nExpr;.  pInde
14300 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45  x->onError = onE
14310 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  rror;.  pIndex->
14320 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d  autoIndex = pNam
14330 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  e==0;.  pIndex->
14340 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
14350 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a  b[iDb].pSchema;.
14360 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
14370 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20  ee if we should 
14380 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65  honor DESC reque
14390 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c  sts on index col
143a0 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
143b0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
143c0 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
143d0 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73      sortOrderMas
143e0 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e  k = -1;   /* Hon
143f0 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c  or DESC */.  }el
14400 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65  se{.    sortOrde
14410 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a  rMask = 0;    /*
14420 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a   Ignore DESC */.
14430 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74    }..  /* Scan t
14440 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
14450 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
14460 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
14470 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64  ed and.  ** load
14480 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69   the column indi
14490 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64  ces into the Ind
144a0 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  ex structure.  R
144b0 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20  eport an error. 
144c0 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d   ** if any colum
144d0 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  n is not found..
144e0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
144f0 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d  pListItem=pList-
14500 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  >a; i<pList->nEx
14510 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74  pr; i++, pListIt
14520 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74  em++){.    const
14530 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20   char *zColName 
14540 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e 61  = pListItem->zNa
14550 6d 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a  me;.    Column *
14560 70 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e 74  pTabCol;.    int
14570 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
14580 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  der;.    char *z
14590 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
145a0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
145b0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
145c0 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a  me */..    for(j
145d0 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62  =0, pTabCol=pTab
145e0 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e  ->aCol; j<pTab->
145f0 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43  nCol; j++, pTabC
14600 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ol++){.      if(
14610 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
14620 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f  zColName, pTabCo
14630 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  l->zName)==0 ) b
14640 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14650 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f  if( j>=pTab->nCo
14660 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
14670 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14680 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73  e, "table %s has
14690 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64   no column named
146a0 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54   %s",.        pT
146b0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e  ab->zName, zColN
146c0 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
146d0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
146e0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ex;.    }.    /*
146f0 20 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65   TODO:  Add a te
14700 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  st to make sure 
14710 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f  that the same co
14720 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65  lumn is not name
14730 64 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74 68  d.    ** more th
14740 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e 20 74  an once within t
14750 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20 20  he same index.  
14760 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 69  Only the first i
14770 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20 20 20 2a  nstance of.    *
14780 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c  * the column wil
14790 6c 20 65 76 65 72 20 62 65 20 75 73 65 64 20 62  l ever be used b
147a0 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e  y the optimizer.
147b0 20 20 4e 6f 74 65 20 74 68 61 74 20 75 73 69 6e    Note that usin
147c0 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 61 6d  g the.    ** sam
147d0 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68  e column more th
147e0 61 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62  an once cannot b
147f0 65 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  e an error becau
14800 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 0a 20  se that would . 
14810 20 20 20 2a 2a 20 62 72 65 61 6b 20 62 61 63 6b     ** break back
14820 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
14830 69 74 79 20 2d 20 69 74 20 6e 65 65 64 73 20 74  ity - it needs t
14840 6f 20 62 65 20 61 20 77 61 72 6e 69 6e 67 2e 0a  o be a warning..
14850 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65      */.    pInde
14860 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
14870 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   j;.    if( pLis
14880 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 26 26 20  tItem->pExpr && 
14890 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
148a0 2d 3e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ->pColl ){.     
148b0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 49 74   assert( pListIt
148c0 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  em->pExpr->pColl
148d0 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20   );.      zColl 
148e0 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20  = zExtra;.      
148f0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
14900 28 6e 45 78 74 72 61 2c 20 7a 45 78 74 72 61 2c  (nExtra, zExtra,
14910 20 22 25 73 22 2c 20 70 4c 69 73 74 49 74 65 6d   "%s", pListItem
14920 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e  ->pExpr->pColl->
14930 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 45  zName);.      zE
14940 78 74 72 61 20 2b 3d 20 28 73 74 72 6c 65 6e 28  xtra += (strlen(
14950 7a 43 6f 6c 6c 29 20 2b 20 31 29 3b 0a 20 20 20  zColl) + 1);.   
14960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43   }else{.      zC
14970 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  oll = pTab->aCol
14980 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
14990 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20   if( !zColl ){. 
149a0 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 64         zColl = d
149b0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e  b->pDfltColl->zN
149c0 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
149d0 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e   }.    if( !db->
149e0 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71  init.busy && !sq
149f0 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
14a00 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
14a10 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 67  , -1) ){.      g
14a20 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
14a30 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
14a40 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
14a50 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20  i] = zColl;.    
14a60 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
14a70 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  er = pListItem->
14a80 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74  sortOrder & sort
14a90 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70  OrderMask;.    p
14aa0 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
14ab0 72 5b 69 5d 20 3d 20 72 65 71 75 65 73 74 65 64  r[i] = requested
14ac0 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20  SortOrder;.  }. 
14ad0 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
14ae0 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 0a  owEst(pIndex);..
14af0 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
14b00 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
14b10 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
14b20 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
14b30 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
14b40 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
14b50 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65  x as a.    ** re
14b60 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52  sult of a PRIMAR
14b70 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
14b80 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75  clause on a colu
14b90 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f  mn definition, o
14ba0 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41  r.    ** a PRIMA
14bb0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
14bc0 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e   clause followin
14bd0 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  g the column def
14be0 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  initions..    **
14bf0 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20   i.e. one of:.  
14c00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41    **.    ** CREA
14c10 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49  TE TABLE t(x PRI
14c20 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
14c30 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
14c40 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  E t(x, y, UNIQUE
14c50 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a  (x, y));.    **.
14c60 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61      ** Either wa
14c70 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  y, check to see 
14c80 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  if the table alr
14c90 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e  eady has such an
14ca0 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a   index. If.    *
14cb0 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68  * so, don't both
14cc0 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73  er creating this
14cd0 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20   one. This only 
14ce0 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a  applies to.    *
14cf0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
14d00 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e  created indices.
14d10 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73   Users can do as
14d20 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a   they wish with.
14d30 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
14d40 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a  indices..    */.
14d50 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
14d60 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
14d70 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
14d80 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
14d90 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  xt){.      int k
14da0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14db0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
14dc0 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20  E_None );.      
14dd0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 75  assert( pIdx->au
14de0 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20 20 20  toIndex );.     
14df0 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
14e00 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
14e10 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  e );..      if( 
14e20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70  pIdx->nColumn!=p
14e30 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
14e40 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
14e50 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78   for(k=0; k<pIdx
14e60 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b  ->nColumn; k++){
14e70 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
14e80 68 61 72 20 2a 7a 31 20 3d 20 70 49 64 78 2d 3e  har *z1 = pIdx->
14e90 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
14ea0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14eb0 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  2 = pIndex->azCo
14ec0 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[k];.        i
14ed0 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
14ee0 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69  n[k]!=pIndex->ai
14ef0 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61  Column[k] ) brea
14f00 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  k;.        if( p
14f10 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
14f20 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 53 6f 72  k]!=pIndex->aSor
14f30 74 4f 72 64 65 72 5b 6b 5d 20 29 20 62 72 65 61  tOrder[k] ) brea
14f40 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  k;.        if( z
14f50 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74 65 33  1!=z2 && sqlite3
14f60 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20  StrICmp(z1, z2) 
14f70 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
14f80 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49  .      if( k==pI
14f90 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
14fa0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
14fb0 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78  >onError!=pIndex
14fc0 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->onError ){.   
14fd0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
14fe0 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65  onstraint create
14ff0 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  s the same index
15000 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20   as a previous. 
15010 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
15020 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64  traint specified
15030 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68   somewhere in th
15040 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
15050 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
15060 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74      ** However t
15070 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  he ON CONFLICT c
15080 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65  lauses are diffe
15090 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68  rent. If both th
150a0 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
150b0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
150c0 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75  the previous equ
150d0 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69  ivalent constrai
150e0 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74  nt have explicit
150f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e  .          ** ON
15100 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
15110 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  s this is an err
15120 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  or. Otherwise, u
15130 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  se the.         
15140 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73   ** explicitly s
15150 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f  pecified behavio
15160 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ur for the index
15170 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
15180 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
15190 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
151a0 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
151b0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
151c0 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
151d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
151e0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
151f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15200 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
15210 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
15220 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
15230 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
15240 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
15250 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
15260 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
15270 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
15280 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
15290 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
152a0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
152b0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
152c0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
152d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
152e0 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
152f0 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
15300 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
15310 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
15320 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
15330 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
15340 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  s. .  */.  if( d
15350 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
15360 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
15370 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
15380 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d  hInsert(&pIndex-
15390 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
153a0 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
153c0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  dex->zName, strl
153d0 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  en(pIndex->zName
153e0 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  )+1, pIndex);.  
153f0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
15400 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64   assert( p==pInd
15410 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ex );  /* Malloc
15420 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
15430 64 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d  d */.      db->m
15440 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
15450 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
15460 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
15470 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61     }.    db->fla
15480 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
15490 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20  ernChanges;.    
154a0 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
154b0 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
154c0 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
154d0 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a  .newTnum;.    }.
154e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
154f0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
15500 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20  s 0 then create 
15510 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73  the index on dis
15520 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e  k.  This.  ** in
15530 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74  volves writing t
15540 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68  he index into th
15550 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
15560 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  nd filling in th
15570 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74  e.  ** index wit
15580 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  h the current ta
15590 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20  ble contents..  
155a0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e  **.  ** The db->
155b0 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 77  init.busy is 0 w
155c0 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72  hen the user fir
155d0 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41  st enters a CREA
155e0 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63  TE INDEX .  ** c
155f0 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69  ommand.  db->ini
15600 74 2e 62 75 73 79 20 69 73 20 31 20 77 68 65 6e  t.busy is 1 when
15610 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f   a database is o
15620 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20  pened and .  ** 
15630 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
15640 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64  tements are read
15650 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74   out of the mast
15660 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20  er table.  In.  
15670 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61  ** the latter ca
15680 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  se the index alr
15690 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64  eady exists on d
156a0 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68  isk, which is wh
156b0 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  y.  ** we don't 
156c0 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65  want to recreate
156d0 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   it..  **.  ** I
156e0 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74  f pTblName==0 it
156f0 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65   means this inde
15700 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  x is generated a
15710 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a  s a primary key.
15720 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63    ** or UNIQUE c
15730 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43  onstraint of a C
15740 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
15750 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68  ement.  Since th
15760 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73  e table.  ** has
15770 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74   just been creat
15780 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  ed, it contains 
15790 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  no data and the 
157a0 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61  index initializa
157b0 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63  tion.  ** step c
157c0 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
157d0 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64   */.  else if( d
157e0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
157f0 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  ){.    Vdbe *v;.
15800 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
15810 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20  .    int iMem = 
15820 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
15830 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
15840 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
15850 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
15860 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
15870 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a  _index;...    /*
15880 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74   Create the root
15890 70 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64  page for the ind
158a0 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ex.    */.    sq
158b0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
158c0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
158d0 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   1, iDb);.    sq
158e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
158f0 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  v, OP_CreateInde
15900 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a  x, iDb, iMem);..
15910 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68      /* Gather th
15920 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
15930 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  of the CREATE IN
15940 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  DEX statement in
15950 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53  to.    ** the zS
15960 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20  tmt variable.   
15970 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61   */.    if( pSta
15980 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20  rt && pEnd ){.  
15990 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69      /* A named i
159a0 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70  ndex with an exp
159b0 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44  licit CREATE IND
159c0 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
159d0 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
159e0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
159f0 20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58   "CREATE%s INDEX
15a00 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20   %.*s",.        
15a10 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
15a20 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45   ? "" : " UNIQUE
15a30 22 2c 0a 20 20 20 20 20 20 20 20 70 45 6e 64 2d  ",.        pEnd-
15a40 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20  >z - pName->z + 
15a50 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65  1,.        pName
15a60 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->z);.    }else{
15a70 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74  .      /* An aut
15a80 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65  omatic index cre
15a90 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52  ated by a PRIMAR
15aa0 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
15ab0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
15ac0 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73      /* zStmt = s
15ad0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22  qlite3MPrintf(""
15ae0 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d  ); */.      zStm
15af0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 0;.    }..  
15b00 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72    /* Add an entr
15b10 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74  y in sqlite_mast
15b20 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  er for this inde
15b30 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  x.    */.    sql
15b40 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
15b50 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
15b60 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51   "INSERT INTO %Q
15b70 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65  .%s VALUES('inde
15b80 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29  x',%Q,%Q,#%d,%Q)
15b90 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  ;",.        db->
15ba0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
15bb0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
15bc0 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ),.        pInde
15bd0 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  x->zName,.      
15be0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
15bf0 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20         iMem,.   
15c00 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29       zStmt.    )
15c10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
15c20 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a  ree(db, zStmt);.
15c30 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65  .    /* Fill the
15c40 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61   index with data
15c50 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65   and reparse the
15c60 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e   schema. Code an
15c70 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a   OP_Expire.    *
15c80 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
15c90 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64  all pre-compiled
15ca0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
15cb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c   */.    if( pTbl
15cc0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Name ){.      sq
15cd0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
15ce0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
15cf0 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71   iMem);.      sq
15d00 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
15d10 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
15d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15d30 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61  eAddOp4(v, OP_Pa
15d40 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
15d50 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73  0, 0,.         s
15d60 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
15d70 2c 20 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70  , "name='%q'", p
15d80 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50  Index->zName), P
15d90 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
15da0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15db0 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65  Op1(v, OP_Expire
15dc0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
15dd0 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e  .  /* When addin
15de0 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68  g an index to th
15df0 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65  e list of indice
15e00 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d  s for a table, m
15e10 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c  ake.  ** sure al
15e20 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65  l indices labele
15e30 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d  d OE_Replace com
15e40 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73  e after all thos
15e50 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f  e labeled.  ** O
15e60 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20  E_Ignore.  This 
15e70 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
15e80 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
15e90 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45  ration of UPDATE
15ea0 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54  .  ** and INSERT
15eb0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
15ec0 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54  >init.busy || pT
15ed0 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  blName==0 ){.   
15ee0 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45   if( onError!=OE
15ef0 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62  _Replace || pTab
15f00 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20  ->pIndex==0.    
15f10 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49       || pTab->pI
15f20 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
15f30 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20  E_Replace){.    
15f40 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
15f50 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
15f60 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64        pTab->pInd
15f70 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  ex = pIndex;.   
15f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
15f90 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54  dex *pOther = pT
15fa0 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
15fb0 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d    while( pOther-
15fc0 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72  >pNext && pOther
15fd0 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72  ->pNext->onError
15fe0 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  !=OE_Replace ){.
15ff0 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d          pOther =
16000 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
16010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
16020 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f  ndex->pNext = pO
16030 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
16040 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74     pOther->pNext
16050 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
16060 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b  .    pIndex = 0;
16070 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
16080 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69   up before exiti
16090 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74  ng */.exit_creat
160a0 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70  e_index:.  if( p
160b0 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 66 72 65  Index ){.    fre
160c0 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
160d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
160e0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
160f0 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
16100 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
16110 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  b, pTblName);.  
16120 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16130 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  , zName);.  retu
16140 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  rn;.}../*.** Gen
16150 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 61  erate code to ma
16160 6b 65 20 73 75 72 65 20 74 68 65 20 66 69 6c 65  ke sure the file
16170 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69   format number i
16180 73 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 6f  s at least minFo
16190 72 6d 61 74 2e 0a 2a 2a 20 54 68 65 20 67 65 6e  rmat..** The gen
161a0 65 72 61 74 65 64 20 63 6f 64 65 20 77 69 6c 6c  erated code will
161b0 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69   increase the fi
161c0 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72  le format number
161d0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
161e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 69  /.void sqlite3Mi
161f0 6e 69 6d 75 6d 46 69 6c 65 46 6f 72 6d 61 74 28  nimumFileFormat(
16200 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
16210 6e 74 20 69 44 62 2c 20 69 6e 74 20 6d 69 6e 46  nt iDb, int minF
16220 6f 72 6d 61 74 29 7b 0a 20 20 56 64 62 65 20 2a  ormat){.  Vdbe *
16230 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  v;.  v = sqlite3
16240 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
16250 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
16260 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
16270 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
16280 65 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 20 3d  e);.    int r2 =
16290 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
162a0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
162b0 69 6e 74 20 6a 31 3b 0a 20 20 20 20 73 71 6c 69  int j1;.    sqli
162c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
162d0 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
162e0 69 44 62 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  iDb, r1, 1);.   
162f0 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
16300 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
16310 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16320 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
16330 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 72  er, minFormat, r
16340 32 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c  2);.    j1 = sql
16350 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16360 2c 20 4f 50 5f 47 65 2c 20 72 32 2c 20 30 2c 20  , OP_Ge, r2, 0, 
16370 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
16380 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16390 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
163a0 20 31 2c 20 72 32 29 3b 0a 20 20 20 20 73 71 6c   1, r2);.    sql
163b0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
163c0 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c  (v, j1);.    sql
163d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
163e0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
163f0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
16400 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
16410 2c 20 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  , r2);.  }.}../*
16420 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64  .** Fill the Ind
16430 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72  ex.aiRowEst[] ar
16440 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74  ray with default
16450 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69   information - i
16460 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f  nformation.** to
16470 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65   be used when we
16480 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68   have not run th
16490 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  e ANALYZE comman
164a0 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73  d..**.** aiRowEs
164b0 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20  t[0] is suppose 
164c0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
164d0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
164e0 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  s in the index..
164f0 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e  ** Since we do n
16500 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31  ot know, guess 1
16510 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77   million.  aiRow
16520 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74  Est[1] is an est
16530 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  imate of the.** 
16540 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
16550 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
16560 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
16570 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74  cular value of t
16580 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75  he.** first colu
16590 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
165a0 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73    aiRowEst[2] is
165b0 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
165c0 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
165d0 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68   rows that match
165e0 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
165f0 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20  combiniation of 
16600 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75  the first 2 colu
16610 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e  mns.** of the in
16620 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  dex.  And so for
16630 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77  th.  It must alw
16640 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20  ays be the case 
16650 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20  that.*.**       
16660 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c      aiRowEst[N]<
16670 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a  =aiRowEst[N-1].*
16680 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
16690 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a  wEst[N]>=1.**.**
166a0 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74   Apart from that
166b0 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65  , we have little
166c0 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65   to go on beside
166d0 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74  s intuition as t
166e0 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73  o.** how aiRowEs
166f0 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  t[] should be in
16700 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20  itialized.  The 
16710 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65  numbers generate
16720 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61  d here.** are ba
16730 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76  sed on typical v
16740 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61  alues found in a
16750 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a  ctual indices..*
16760 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
16770 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65  faultRowEst(Inde
16780 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69  x *pIdx){.  unsi
16790 67 6e 65 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e  gned *a = pIdx->
167a0 61 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20  aiRowEst;.  int 
167b0 69 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d  i;.  assert( a!=
167c0 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30  0 );.  a[0] = 10
167d0 30 30 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70  00000;.  for(i=p
167e0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e  Idx->nColumn; i>
167f0 3d 35 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b  =5; i--){.    a[
16800 69 5d 20 3d 20 35 3b 0a 20 20 7d 0a 20 20 77 68  i] = 5;.  }.  wh
16810 69 6c 65 28 20 69 3e 3d 31 20 29 7b 0a 20 20 20  ile( i>=1 ){.   
16820 20 61 5b 69 5d 20 3d 20 31 31 20 2d 20 69 3b 0a   a[i] = 11 - i;.
16830 20 20 20 20 69 2d 2d 3b 0a 20 20 7d 0a 20 20 69      i--;.  }.  i
16840 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
16850 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20  !=OE_None ){.   
16860 20 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   a[pIdx->nColumn
16870 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ] = 1;.  }.}../*
16880 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16890 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
168a0 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
168b0 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ex.  This routin
168c0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  e.** implements 
168d0 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73  the DROP INDEX s
168e0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
168f0 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64  d sqlite3DropInd
16900 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
16910 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
16920 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b  , int ifExists){
16930 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
16940 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
16950 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
16960 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
16970 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Db;..  if( pPars
16980 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
16990 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
169a0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
169b0 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61  p_index;.  }.  a
169c0 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
169d0 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53  rc==1 );.  if( S
169e0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
169f0 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
16a00 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  se) ){.    goto 
16a10 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
16a20 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
16a30 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
16a40 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  (db, pName->a[0]
16a50 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
16a60 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
16a70 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
16a80 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78  ){.    if( !ifEx
16a90 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71  ists ){.      sq
16aa0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
16ab0 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
16ac0 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65  ndex: %S", pName
16ad0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
16ae0 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
16af0 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  ema = 1;.    got
16b00 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
16b10 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  x;.  }.  if( pIn
16b20 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29  dex->autoIndex )
16b30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
16b40 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
16b50 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
16b60 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20  with UNIQUE ".  
16b70 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20      "or PRIMARY 
16b80 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  KEY constraint c
16b90 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  annot be dropped
16ba0 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
16bb0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
16bc0 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
16bd0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
16be0 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
16bf0 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20  chema);.#ifndef 
16c00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
16c10 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
16c20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c    int code = SQL
16c30 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a  ITE_DROP_INDEX;.
16c40 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
16c50 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
16c60 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
16c70 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
16c80 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
16c90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
16ca0 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
16cb0 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71  iDb);.    if( sq
16cc0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
16cd0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
16ce0 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
16cf0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
16d00 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
16d10 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
16d20 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
16d30 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51   iDb ) code = SQ
16d40 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
16d50 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
16d60 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
16d70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e  Parse, code, pIn
16d80 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  dex->zName, pTab
16d90 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
16da0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
16db0 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
16dc0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
16dd0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
16de0 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
16df0 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74  index and from t
16e00 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
16e10 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
16e20 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
16e30 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
16e40 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
16e50 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
16e60 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 1, iDb);.    
16e70 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
16e80 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
16e90 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
16ea0 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d  Q.%s WHERE name=
16eb0 25 51 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e  %Q",.       db->
16ec0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
16ed0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
16ee0 29 2c 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78  ),.       pIndex
16ef0 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
16f00 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
16f10 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c  ndTable(db, "sql
16f20 69 74 65 5f 73 74 61 74 31 22 2c 20 64 62 2d 3e  ite_stat1", db->
16f30 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 20  aDb[iDb].zName) 
16f40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16f50 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
16f60 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c  se,.        "DEL
16f70 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69  ETE FROM %Q.sqli
16f80 74 65 5f 73 74 61 74 31 20 57 48 45 52 45 20 69  te_stat1 WHERE i
16f90 64 78 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20  dx=%Q",.        
16fa0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
16fb0 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  me, pIndex->zNam
16fc0 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
16fd0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
16fe0 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
16ff0 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72   iDb);.    destr
17000 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
17010 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  e, pIndex->tnum,
17020 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
17030 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17040 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44  OP_DropIndex, iD
17050 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d  b, 0, 0, pIndex-
17060 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
17070 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78  .exit_drop_index
17080 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
17090 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
170a0 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41  me);.}../*.** pA
170b0 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65  rray is a pointe
170c0 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  r to an array of
170d0 20 6f 62 6a 65 63 74 73 2e 20 20 45 61 63 68 20   objects.  Each 
170e0 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a  object in the.**
170f0 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72   array is szEntr
17100 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
17110 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
17120 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 0a 2a  llocates a new.*
17130 2a 20 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65 20  * object on the 
17140 65 6e 64 20 6f 66 20 74 68 65 20 61 72 72 61 79  end of the array
17150 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79  ..**.** *pnEntry
17160 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
17170 66 20 65 6e 74 72 69 65 73 20 61 6c 72 65 61 64  f entries alread
17180 79 20 69 6e 20 75 73 65 2e 20 20 2a 70 6e 41 6c  y in use.  *pnAl
17190 6c 6f 63 20 69 73 0a 2a 2a 20 74 68 65 20 70 72  loc is.** the pr
171a0 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
171b0 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  ed size of the a
171c0 72 72 61 79 2e 20 20 69 6e 69 74 53 69 7a 65 20  rray.  initSize 
171d0 69 73 20 74 68 65 0a 2a 2a 20 73 75 67 67 65 73  is the.** sugges
171e0 74 65 64 20 69 6e 69 74 69 61 6c 20 61 72 72 61  ted initial arra
171f0 79 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 69 6f  y size allocatio
17200 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64  n..**.** The ind
17210 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e  ex of the new en
17220 74 72 79 20 69 73 20 72 65 74 75 72 6e 65 64 20  try is returned 
17230 69 6e 20 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  in *pIdx..**.** 
17240 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
17250 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
17260 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f  o the array of o
17270 62 6a 65 63 74 73 2e 20 20 54 68 69 73 0a 2a 2a  bjects.  This.**
17280 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61   might be the sa
17290 6d 65 20 61 73 20 74 68 65 20 70 41 72 72 61 79  me as the pArray
172a0 20 70 61 72 61 6d 65 74 65 72 20 6f 72 20 69 74   parameter or it
172b0 20 6d 69 67 68 74 20 62 65 20 61 20 64 69 66 66   might be a diff
172c0 65 72 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65 72  erent.** pointer
172d0 20 69 66 20 74 68 65 20 61 72 72 61 79 20 77 61   if the array wa
172e0 73 20 72 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f  s resized..*/.vo
172f0 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79  id *sqlite3Array
17300 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69  Allocate(.  sqli
17310 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a  te3 *db,      /*
17320 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e   Connection to n
17330 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20  otify of malloc 
17340 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f  failures */.  vo
17350 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20  id *pArray,     
17360 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65  /* Array of obje
17370 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72  cts.  Might be r
17380 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20  eallocated */.  
17390 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20  int szEntry,    
173a0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63    /* Size of eac
173b0 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  h object in the 
173c0 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 69  array */.  int i
173d0 6e 69 74 53 69 7a 65 2c 20 20 20 20 20 2f 2a 20  nitSize,     /* 
173e0 53 75 67 67 65 73 74 65 64 20 69 6e 69 74 69 61  Suggested initia
173f0 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e  l allocation, in
17400 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   elements */.  i
17410 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20  nt *pnEntry,    
17420 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62   /* Number of ob
17430 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20  jects currently 
17440 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  in use */.  int 
17450 2a 70 6e 41 6c 6c 6f 63 2c 20 20 20 20 20 2f 2a  *pnAlloc,     /*
17460 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   Current size of
17470 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c   the allocation,
17480 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   in elements */.
17490 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20    int *pIdx     
174a0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
174b0 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20   index of a new 
174c0 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  slot here */.){.
174d0 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
174e0 20 2a 70 6e 45 6e 74 72 79 20 3e 3d 20 2a 70 6e   *pnEntry >= *pn
174f0 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 76 6f 69  Alloc ){.    voi
17500 64 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74  d *pNew;.    int
17510 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65   newSize;.    ne
17520 77 53 69 7a 65 20 3d 20 28 2a 70 6e 41 6c 6c 6f  wSize = (*pnAllo
17530 63 29 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b  c)*2 + initSize;
17540 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
17550 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
17560 20 70 41 72 72 61 79 2c 20 6e 65 77 53 69 7a 65   pArray, newSize
17570 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69  *szEntry);.    i
17580 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
17590 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a      *pIdx = -1;.
175a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 72        return pAr
175b0 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  ray;.    }.    *
175c0 70 6e 41 6c 6c 6f 63 20 3d 20 6e 65 77 53 69 7a  pnAlloc = newSiz
175d0 65 3b 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20  e;.    pArray = 
175e0 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  pNew;.  }.  z = 
175f0 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20  (char*)pArray;. 
17600 20 6d 65 6d 73 65 74 28 26 7a 5b 2a 70 6e 45 6e   memset(&z[*pnEn
17610 74 72 79 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20  try * szEntry], 
17620 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a  0, szEntry);.  *
17630 70 49 64 78 20 3d 20 2a 70 6e 45 6e 74 72 79 3b  pIdx = *pnEntry;
17640 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20  .  ++*pnEntry;. 
17650 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
17660 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
17670 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
17680 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
17690 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
176a0 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
176b0 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
176c0 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
176d0 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
176e0 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
176f0 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
17700 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
17710 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
17720 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
17730 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
17740 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
17750 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
17760 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
17770 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
17780 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
17790 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
177a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
177b0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30  List->nAlloc = 0
177c0 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
177d0 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
177e0 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 64  llocate(.      d
177f0 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  b,.      pList->
17800 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  a,.      sizeof(
17810 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20  pList->a[0]),.  
17820 20 20 20 20 35 2c 0a 20 20 20 20 20 20 26 70 4c      5,.      &pL
17830 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20  ist->nId,.      
17840 26 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2c 0a  &pList->nAlloc,.
17850 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
17860 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73  if( i<0 ){.    s
17870 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
17880 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
17890 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
178a0 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  .  pList->a[i].z
178b0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
178c0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
178d0 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72  pToken);.  retur
178e0 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
178f0 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69  * Delete an IdLi
17900 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
17910 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
17920 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
17930 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
17940 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
17950 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
17960 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
17970 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
17980 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
17990 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
179a0 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
179b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
179c0 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
179d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
179e0 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
179f0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
17a00 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65   in pList of the
17a10 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65   identifier name
17a20 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d  d zId.  Return -
17a30 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e  1.** if not foun
17a40 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
17a50 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c  3IdListIndex(IdL
17a60 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73  ist *pList, cons
17a70 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
17a80 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
17a90 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
17aa0 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   -1;.  for(i=0; 
17ab0 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
17ac0 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
17ad0 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
17ae0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  ->a[i].zName, zN
17af0 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
17b00 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
17b10 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78   -1;.}../*.** Ex
17b20 70 61 6e 64 20 74 68 65 20 73 70 61 63 65 20 61  pand the space a
17b30 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
17b40 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f   given SrcList o
17b50 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61  bject by.** crea
17b60 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20  ting nExtra new 
17b70 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20  slots beginning 
17b80 61 74 20 69 53 74 61 72 74 2e 20 20 69 53 74 61  at iStart.  iSta
17b90 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64  rt is zero based
17ba0 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61  ..** New slots a
17bb0 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
17bc0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75   For example, su
17bd0 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20  ppose a SrcList 
17be0 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69  initially contai
17bf0 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20  ns two entries: 
17c00 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e  A,B..** To appen
17c10 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20  d 3 new entries 
17c20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f  onto the end, do
17c30 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
17c40 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
17c50 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69  large(db, pSrcli
17c60 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a  st, 3, 2);.**.**
17c70 20 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20   After the call 
17c80 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63  above it would c
17c90 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e  ontain:  A, B, n
17ca0 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a  il, nil, nil..**
17cb0 20 49 66 20 74 68 65 20 69 53 74 61 72 74 20 61   If the iStart a
17cc0 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e  rgument had been
17cd0 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c   1 instead of 2,
17ce0 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
17cf0 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62  .** would have b
17d00 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69  een:  A, nil, ni
17d10 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70  l, nil, B.  To p
17d20 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73  repend the new s
17d30 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74  lots,.** the iSt
17d40 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20  art value would 
17d50 62 65 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c  be 0.  The resul
17d60 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20  t then would.** 
17d70 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69  be: nil, nil, ni
17d80 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49  l, A, B..**.** I
17d90 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
17da0 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68 65 20  ation fails the 
17db0 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63 68 61  SrcList is uncha
17dc0 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62  nged.  The.** db
17dd0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
17de0 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65 74 20  lag will be set 
17df0 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c  to true..*/.SrcL
17e00 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
17e10 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 73 71  istEnlarge(.  sq
17e20 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
17e30 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
17e40 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
17e50 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20  y of OOM errors 
17e60 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
17e70 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53  rc,     /* The S
17e80 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c  rcList to be enl
17e90 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  arged */.  int n
17ea0 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a  Extra,        /*
17eb0 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73   Number of new s
17ec0 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70  lots to add to p
17ed0 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e  Src->a[] */.  in
17ee0 74 20 69 53 74 61 72 74 20 20 20 20 20 20 20 20  t iStart        
17ef0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72   /* Index in pSr
17f00 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20  c->a[] of first 
17f10 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20  new slot */.){. 
17f20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61   int i;..  /* Sa
17f30 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
17f40 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74   calling paramet
17f50 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ers */.  assert(
17f60 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20   iStart>=0 );.  
17f70 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d  assert( nExtra>=
17f80 31 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63 3d  1 );.  if( pSrc=
17f90 3d 30 20 7c 7c 20 69 53 74 61 72 74 3e 70 53 72  =0 || iStart>pSr
17fa0 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 61  c->nSrc ){.    a
17fb0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
17fc0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
17fd0 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 7d 0a  eturn pSrc;.  }.
17fe0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
17ff0 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20  dditional space 
18000 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69  if needed */.  i
18010 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45  f( pSrc->nSrc+nE
18020 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f  xtra>pSrc->nAllo
18030 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  c ){.    SrcList
18040 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20   *pNew;.    int 
18050 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e  nAlloc = pSrc->n
18060 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20  Src+nExtra;.    
18070 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
18080 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63  Realloc(db, pSrc
18090 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
180a0 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b   sizeof(*pSrc) +
180b0 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65   (nAlloc-1)*size
180c0 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29  of(pSrc->a[0]) )
180d0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
180e0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
180f0 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
18100 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
18110 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a  urn pSrc;.    }.
18120 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b      pSrc = pNew;
18130 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f  .    pSrc->nAllo
18140 63 20 3d 20 6e 41 6c 6c 6f 63 3b 0a 20 20 7d 0a  c = nAlloc;.  }.
18150 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74  .  /* Move exist
18160 69 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63  ing slots that c
18170 6f 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e 65  ome after the ne
18180 77 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f  wly inserted slo
18190 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74  ts.  ** out of t
181a0 68 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28  he way */.  for(
181b0 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i=pSrc->nSrc-1; 
181c0 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b  i>=iStart; i--){
181d0 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e  .    pSrc->a[i+n
181e0 45 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61  Extra] = pSrc->a
181f0 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d  [i];.  }.  pSrc-
18200 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b  >nSrc += nExtra;
18210 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
18220 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
18230 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65  slots */.  memse
18240 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72  t(&pSrc->a[iStar
18250 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  t], 0, sizeof(pS
18260 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61  rc->a[0])*nExtra
18270 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72  );.  for(i=iStar
18280 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74  t; i<iStart+nExt
18290 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53  ra; i++){.    pS
182a0 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
182b0 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
182c0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
182d0 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65  r to the enlarge
182e0 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72  d SrcList */.  r
182f0 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a  eturn pSrc;.}...
18300 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
18310 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  ew table name to
18320 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
18330 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
18340 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20  w SrcList if.** 
18350 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20  need be.  A new 
18360 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
18370 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
18380 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69  even if pToken i
18390 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  s NULL..**.** A 
183a0 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72  SrcList is retur
183b0 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
183c0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20  there is an OOM 
183d0 65 72 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75  error.  The retu
183e0 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20  rned.** SrcList 
183f0 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d  might be the sam
18400 65 20 61 73 20 74 68 65 20 53 72 63 4c 69 73 74  e as the SrcList
18410 20 74 68 61 74 20 77 61 73 20 69 6e 70 75 74 20   that was input 
18420 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a  or it might be.*
18430 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66  * a new one.  If
18440 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f   an OOM error do
18450 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  es occurs, then 
18460 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20  the prior value 
18470 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74  of pList.** that
18480 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69   is input to thi
18490 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74  s routine is aut
184a0 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64  omatically freed
184b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61  ..**.** If pData
184c0 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  base is not null
184d0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
184e0 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
184f0 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74   optional.** dat
18500 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69  abase name prefi
18510 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20  x.  Like this:  
18520 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22  "database.table"
18530 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65  .  The pDatabase
18540 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
18550 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
18560 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e   the pTable poin
18570 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ts to the databa
18580 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20  se name..** The 
18590 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  SrcList.a[].zNam
185a0 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65  e field is fille
185b0 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
185c0 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68   name which migh
185d0 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70  t.** come from p
185e0 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62  Table (if pDatab
185f0 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20  ase is NULL) or 
18600 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20  from pDatabase. 
18610 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d   .** SrcList.a[]
18620 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69  .zDatabase is fi
18630 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
18640 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d  tabase name from
18650 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77   pTable,.** or w
18660 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64  ith NULL if no d
18670 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69  atabase is speci
18680 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  fied..**.** In o
18690 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63  ther words, if c
186a0 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  all like this:.*
186b0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
186c0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
186d0 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a  d(D,A,B,0);.**.*
186e0 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61  * Then B is a ta
186f0 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
18700 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
18710 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20  s unspecified.  
18720 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b  If called.** lik
18730 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
18740 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
18750 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42  ListAppend(D,A,B
18760 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,C);.**.** Then 
18770 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  C is the table n
18780 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65  ame and B is the
18790 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
187a0 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
187b0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
187c0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
187d0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
187e0 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
187f0 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
18800 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  es */.  SrcList 
18810 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41  *pList,     /* A
18820 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72  ppend to this Sr
18830 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61  cList. NULL crea
18840 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73  tes a new SrcLis
18850 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
18860 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61  able,      /* Ta
18870 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  ble to append */
18880 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  .  Token *pDatab
18890 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ase    /* Databa
188a0 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  se of the table 
188b0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
188c0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
188d0 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
188e0 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
188f0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
18900 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
18910 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20  (SrcList) );.   
18920 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
18930 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
18940 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b  ist->nAlloc = 1;
18950 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73  .  }.  pList = s
18960 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
18970 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20  arge(db, pList, 
18980 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b  1, pList->nSrc);
18990 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
189a0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
189b0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
189c0 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
189d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
189e0 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69  }.  pItem = &pLi
189f0 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
18a00 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74  c-1];.  if( pDat
18a10 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61  abase && pDataba
18a20 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  se->z==0 ){.    
18a30 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  pDatabase = 0;. 
18a40 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
18a50 73 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a  se && pTable ){.
18a60 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70      Token *pTemp
18a70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20   = pDatabase;.  
18a80 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54    pDatabase = pT
18a90 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65  able;.    pTable
18aa0 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20   = pTemp;.  }.  
18ab0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
18ac0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
18ad0 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ken(db, pTable);
18ae0 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  .  pItem->zDatab
18af0 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ase = sqlite3Nam
18b00 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
18b10 44 61 74 61 62 61 73 65 29 3b 0a 20 20 72 65 74  Database);.  ret
18b20 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
18b30 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64 62 65 43  .** Assign VdbeC
18b40 75 72 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62  ursor index numb
18b50 65 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65  ers to all table
18b60 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a  s in a SrcList.*
18b70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
18b80 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
18b90 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
18ba0 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  , SrcList *pList
18bb0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
18bc0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
18bd0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65  m *pItem;.  asse
18be0 72 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72  rt(pList || pPar
18bf0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
18c00 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c  iled );.  if( pL
18c10 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ist ){.    for(i
18c20 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
18c30 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  >a; i<pList->nSr
18c40 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
18c50 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
18c60 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20  m->iCursor>=0 ) 
18c70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74  break;.      pIt
18c80 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50  em->iCursor = pP
18c90 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
18ca0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
18cb0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
18cc0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
18cd0 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
18ce0 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65  arse, pItem->pSe
18cf0 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20  lect->pSrc);.   
18d00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
18d10 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
18d20 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74  n entire SrcList
18d30 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69   including all i
18d40 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e  ts substructure.
18d50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18d60 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 73 71  SrcListDelete(sq
18d70 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69  lite3 *db, SrcLi
18d80 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
18d90 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72  t i;.  struct Sr
18da0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
18db0 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
18dc0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
18dd0 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
18de0 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
18df0 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
18e00 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
18e10 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
18e20 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
18e30 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
18e40 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  db, pItem->zName
18e50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
18e60 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
18e70 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 73 71 6c  zAlias);.    sql
18e80 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
18e90 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20  Item->zIndex);. 
18ea0 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
18eb0 54 61 62 6c 65 28 70 49 74 65 6d 2d 3e 70 54 61  Table(pItem->pTa
18ec0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  b);.    sqlite3S
18ed0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
18ee0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pItem->pSelect);
18ef0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
18f00 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
18f10 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ->pOn);.    sqli
18f20 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
18f30 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e  db, pItem->pUsin
18f40 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
18f50 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
18f60 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
18f70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
18f80 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
18f90 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74  r to add a new t
18fa0 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  erm to the.** en
18fb0 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46  d of a growing F
18fc0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ROM clause.  The
18fd0 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
18fe0 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a  s the part of.**
18ff0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19000 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
19010 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  y been construct
19020 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c  ed.  "p" is NULL
19030 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
19040 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66  he first term of
19050 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19060 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  .  pTable and pD
19070 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74  atabase.** are t
19080 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
19090 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73  able and databas
190a0 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
190b0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ROM clause term.
190c0 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73  .** pDatabase is
190d0 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74   NULL if the dat
190e0 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69  abase name quali
190f0 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  fier is missing 
19100 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63  - the.** usual c
19110 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72  ase.  If the ter
19120 6d 20 68 61 73 20 61 20 61 6c 69 61 73 2c 20 74  m has a alias, t
19130 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74  hen pAlias point
19140 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61  s to the.** alia
19150 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65  s token.  If the
19160 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75   term is a subqu
19170 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75  ery, then pSubqu
19180 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45  ery is the.** SE
19190 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
191a0 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79  hat the subquery
191b0 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70   encodes.  The p
191c0 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61  Table and.** pDa
191d0 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72  tabase parameter
191e0 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73  s are NULL for s
191f0 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20  ubqueries.  The 
19200 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a  pOn and pUsing.*
19210 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  * parameters are
19220 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
19230 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
19240 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
19250 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63  Return a new Src
19260 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64  List which encod
19270 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77  es is the FROM w
19280 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74  ith the new.** t
19290 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72  erm added..*/.Sr
192a0 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
192b0 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
192c0 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
192d0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
192e0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
192f0 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
19300 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
19310 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20  * The left part 
19320 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
19330 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20  se already seen 
19340 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
19350 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
19360 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
19370 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  e to add to the 
19380 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
19390 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
193a0 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e,       /* Name
193b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
193c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62   containing pTab
193d0 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
193e0 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20  Alias,          
193f0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  /* The right-han
19400 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53  d side of the AS
19410 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a   subexpression *
19420 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
19430 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41  query,      /* A
19440 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69   subquery used i
19450 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62  n place of a tab
19460 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70  le name */.  Exp
19470 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20  r *pOn,         
19480 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63       /* The ON c
19490 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
194a0 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73  */.  IdList *pUs
194b0 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ing          /* 
194c0 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  The USING clause
194d0 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b   of a join */.){
194e0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
194f0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
19500 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
19510 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d  Parse->db;.  p =
19520 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
19530 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61  ppend(db, p, pTa
19540 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b  ble, pDatabase);
19550 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
19560 2d 3e 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ->nSrc==0 ){.   
19570 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
19580 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 20  te(db, pOn);.   
19590 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
195a0 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29  lete(db, pUsing)
195b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
195c0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
195d0 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 72 65  ubquery);.    re
195e0 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 20 20 70 49  turn p;.  }.  pI
195f0 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
19600 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 41  Src-1];.  if( pA
19610 6c 69 61 73 20 26 26 20 70 41 6c 69 61 73 2d 3e  lias && pAlias->
19620 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  n ){.    pItem->
19630 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
19640 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
19650 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20  , pAlias);.  }. 
19660 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
19670 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70  = pSubquery;.  p
19680 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b  Item->pOn = pOn;
19690 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  .  pItem->pUsing
196a0 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74   = pUsing;.  ret
196b0 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
196c0 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42  Add an INDEXED B
196d0 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44  Y or NOT INDEXED
196e0 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d   clause to the m
196f0 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
19700 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f  ed .** element o
19710 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
19720 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
19730 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
19740 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19750 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
19760 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19770 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65  SrcList *p, Toke
19780 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a  n *pIndexedBy){.
19790 20 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79    if( pIndexedBy
197a0 20 26 26 20 70 20 26 26 20 70 2d 3e 6e 53 72 63   && p && p->nSrc
197b0 3e 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  >0 ){.    struct
197c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
197d0 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
197e0 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73  nSrc-1];.    ass
197f0 65 72 74 28 20 70 49 74 65 6d 2d 3e 6e 6f 74 49  ert( pItem->notI
19800 6e 64 65 78 65 64 3d 3d 30 20 26 26 20 70 49 74  ndexed==0 && pIt
19810 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30 20 29 3b  em->zIndex==0 );
19820 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65  .    if( pIndexe
19830 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49  dBy->n==1 && !pI
19840 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20  ndexedBy->z ){. 
19850 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49       /* A "NOT I
19860 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77  NDEXED" clause w
19870 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65  as supplied. See
19880 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20   parse.y .      
19890 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e  ** construct "in
198a0 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64  dexed_opt" for d
198b0 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
198c0 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78   pItem->notIndex
198d0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
198e0 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  e{.      pItem->
198f0 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  zIndex = sqlite3
19900 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
19910 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78  arse->db, pIndex
19920 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  edBy);.    }.  }
19930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62  .}../*.** When b
19940 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f  uilding up a FRO
19950 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
19960 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e  parser, the join
19970 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
19980 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68  initially attach
19990 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ed to the left o
199a0 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65  perand.  But the
199b0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
199c0 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a  ** expects the j
199d0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  oin operator to 
199e0 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  be on the right 
199f0 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72  operand.  This r
19a00 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73  outine.** Shifts
19a10 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74   all join operat
19a20 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  ors from left to
19a30 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e   right for an en
19a40 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61  tire FROM.** cla
19a50 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  use..**.** Examp
19a60 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20  le: Suppose the 
19a70 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69  join is like thi
19a80 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
19a90 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f     A natural cro
19aa0 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20  ss join B.**.** 
19ab0 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  The operator is 
19ac0 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a  "natural cross j
19ad0 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64  oin".  The A and
19ae0 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20   B operands are 
19af0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e  stored.** in p->
19b00 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d  a[0] and p->a[1]
19b10 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
19b20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74   The parser init
19b30 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65  ially stores the
19b40 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74  .** operator wit
19b50 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69  h A.  This routi
19b60 6e 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f  ne shifts that o
19b70 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20  perator over to 
19b80 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  B..*/.void sqlit
19b90 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f  e3SrcListShiftJo
19ba0 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a  inType(SrcList *
19bb0 70 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70  p){.  if( p && p
19bc0 2d 3e 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ->a ){.    int i
19bd0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e  ;.    for(i=p->n
19be0 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  Src-1; i>0; i--)
19bf0 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  {.      p->a[i].
19c00 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b  jointype = p->a[
19c10 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20  i-1].jointype;. 
19c20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d     }.    p->a[0]
19c30 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20  .jointype = 0;. 
19c40 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69   }.}../*.** Begi
19c50 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
19c60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
19c70 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
19c80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
19c90 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69  nt type){.  sqli
19ca0 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
19cb0 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  *v;.  int i;..  
19cc0 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
19cd0 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
19ce0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
19cf0 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
19d00 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
19d10 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
19d20 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
19d30 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
19d40 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
19d50 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
19d60 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20  CTION, "BEGIN", 
19d70 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
19d80 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
19d90 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
19da0 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e   if( !v ) return
19db0 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b  ;.  if( type!=TK
19dc0 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20  _DEFERRED ){.   
19dd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
19de0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
19df0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19e00 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  p2(v, OP_Transac
19e10 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d  tion, i, (type==
19e20 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29  TK_EXCLUSIVE)+1)
19e30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19e40 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
19e50 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  i);.    }.  }.  
19e60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19e70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
19e80 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  it, 0, 0);.}../*
19e90 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61  .** Commit a tra
19ea0 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
19eb0 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72   sqlite3CommitTr
19ec0 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
19ed0 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
19ee0 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
19ef0 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
19f00 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
19f10 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
19f20 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
19f30 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
19f40 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
19f50 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19f60 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
19f70 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
19f80 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
19f90 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43  _TRANSACTION, "C
19fa0 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 20  OMMIT", 0, 0) ) 
19fb0 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
19fc0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
19fd0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
19fe0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
19ff0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
1a000 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b  toCommit, 1, 0);
1a010 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  .  }.}../*.** Ro
1a020 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1a030 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
1a040 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  ite3RollbackTran
1a050 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
1a060 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
1a070 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
1a080 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
1a090 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
1a0a0 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
1a0b0 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
1a0c0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
1a0d0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
1a0e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a0f0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
1a100 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1a110 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
1a120 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c  RANSACTION, "ROL
1a130 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20  LBACK", 0, 0) ) 
1a140 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
1a150 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1a160 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
1a170 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1a180 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
1a190 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b  toCommit, 1, 1);
1a1a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
1a1b0 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50  ke sure the TEMP
1a1c0 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
1a1d0 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20  n and available 
1a1e0 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e  for use.  Return
1a1f0 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
1a200 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65  f errors.  Leave
1a210 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
1a220 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73  ges in the pPars
1a230 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
1a240 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  int sqlite3OpenT
1a250 65 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73  empDatabase(Pars
1a260 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
1a270 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1a280 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62  se->db;.  if( db
1a290 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20  ->aDb[1].pBt==0 
1a2a0 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  && !pParse->expl
1a2b0 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ain ){.    int r
1a2c0 63 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  c;.    static co
1a2d0 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
1a2e0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
1a2f0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1a300 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
1a310 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
1a320 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
1a330 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
1a340 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
1a350 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
1a360 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20  ONCLOSE |.      
1a370 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1a380 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63  TEMP_DB;..    rc
1a390 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46   = sqlite3BtreeF
1a3a0 61 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c  actory(db, 0, 0,
1a3b0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1a3c0 43 41 43 48 45 5f 53 49 5a 45 2c 20 66 6c 61 67  CACHE_SIZE, flag
1a3d0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
1a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3f0 20 20 20 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e      &db->aDb[1].
1a400 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pBt);.    if( rc
1a410 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a420 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1a430 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
1a440 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74  able to open a t
1a450 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
1a460 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c  e ".        "fil
1a470 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65  e for storing te
1a480 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29  mporary tables")
1a490 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1a4a0 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  rc = rc;.      r
1a4b0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1a4c0 20 20 20 61 73 73 65 72 74 28 20 28 64 62 2d 3e     assert( (db->
1a4d0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
1a4e0 6e 54 72 61 6e 73 29 3d 3d 30 20 7c 7c 20 64 62  nTrans)==0 || db
1a4f0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 3b 0a  ->autoCommit );.
1a500 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
1a510 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
1a520 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
1a530 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 73 71  erJournalMode(sq
1a540 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
1a550 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 2c  db->aDb[1].pBt),
1a560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a570 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d               db-
1a580 3e 64 66 6c 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65  >dfltJournalMode
1a590 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1a5a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
1a5b0 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
1a5c0 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20  hat will verify 
1a5d0 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
1a5e0 65 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61  e and start.** a
1a5f0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
1a600 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20  n for all named 
1a610 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a  database files..
1a620 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f  **.** It is impo
1a630 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73  rtant that all s
1a640 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65  chema cookies be
1a650 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c   verified and al
1a660 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61  l.** read transa
1a670 63 74 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65  ctions be starte
1a680 64 20 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e  d before anythin
1a690 67 20 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69  g else happens i
1a6a0 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72  n.** the VDBE pr
1a6b0 6f 67 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73  ogram.  But this
1a6c0 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1a6d0 63 61 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63  called after muc
1a6e0 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20  h other.** code 
1a6f0 68 61 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74  has been generat
1a700 65 64 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20  ed.  So here is 
1a710 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a  what we do:.**.*
1a720 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  * The first time
1a730 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1a740 20 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65   called, we code
1a750 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74   an OP_Goto that
1a760 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f  .** will jump to
1a770 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74   a subroutine at
1a780 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1a790 70 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77  program.  Then w
1a7a0 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72  e.** record ever
1a7b0 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  y database that 
1a7c0 6e 65 65 64 73 20 69 74 73 20 73 63 68 65 6d 61  needs its schema
1a7d0 20 76 65 72 69 66 69 65 64 20 69 6e 20 74 68 65   verified in the
1a7e0 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  .** pParse->cook
1a7f0 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c  ieMask field.  L
1a800 61 74 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20  ater, after all 
1a810 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73 20 62  other code has b
1a820 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64  een.** generated
1a830 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
1a840 20 74 68 61 74 20 64 6f 65 73 20 74 68 65 20 63   that does the c
1a850 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69  ookie verificati
1a860 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74  ons and.** start
1a870 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
1a880 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64  ns will be coded
1a890 20 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f   and the OP_Goto
1a8a0 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c   P2 value.** wil
1a8b0 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69  l be made to poi
1a8c0 6e 74 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f  nt to that subro
1a8d0 75 74 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65  utine.  The gene
1a8e0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  ration of the.**
1a8f0 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61   cookie verifica
1a900 74 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20  tion subroutine 
1a910 63 6f 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20  code happens in 
1a920 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64  sqlite3FinishCod
1a930 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ing()..**.** If 
1a940 69 44 62 3c 30 20 74 68 65 6e 20 63 6f 64 65 20  iDb<0 then code 
1a950 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79  the OP_Goto only
1a960 20 2d 20 64 6f 6e 27 74 20 73 65 74 20 66 6c 61   - don't set fla
1a970 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 0a  g to verify the.
1a980 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79  ** schema on any
1a990 20 64 61 74 61 62 61 73 65 73 2e 20 20 54 68 69   databases.  Thi
1a9a0 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
1a9b0 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f 50   position the OP
1a9c0 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69  _Goto.** early i
1a9d0 6e 20 74 68 65 20 63 6f 64 65 2c 20 62 65 66 6f  n the code, befo
1a9e0 72 65 20 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e  re we know if an
1a9f0 79 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  y database table
1aa00 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a  s will be used..
1aa10 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
1aa20 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
1aa30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1aa40 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
1aa50 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
1aa60 76 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a  v;.  int mask;..
1aa70 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1aa80 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1aa90 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
1aaa0 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79  n;  /* This only
1aab0 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 72   happens if ther
1aac0 65 20 77 61 73 20 61 20 70 72 69 6f 72 20 65 72  e was a prior er
1aad0 72 6f 72 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  ror */.  db = pP
1aae0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
1aaf0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
1ab00 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  to==0 ){.    pPa
1ab10 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20  rse->cookieGoto 
1ab20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1ab30 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1ab40 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69  0, 0)+1;.  }.  i
1ab50 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20  f( iDb>=0 ){.   
1ab60 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
1ab70 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65  >nDb );.    asse
1ab80 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  rt( db->aDb[iDb]
1ab90 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d  .pBt!=0 || iDb==
1aba0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
1abb0 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f   iDb<SQLITE_MAX_
1abc0 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20  ATTACHED+2 );.  
1abd0 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b    mask = 1<<iDb;
1abe0 0a 20 20 20 20 69 66 28 20 28 70 50 61 72 73 65  .    if( (pParse
1abf0 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d  ->cookieMask & m
1ac00 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
1ac10 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
1ac20 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
1ac30 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
1ac40 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62  eValue[iDb] = db
1ac50 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
1ac60 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  ma->schema_cooki
1ac70 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e;.      if( !OM
1ac80 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
1ac90 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==1 ){.        s
1aca0 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
1acb0 74 61 62 61 73 65 28 70 50 61 72 73 65 29 3b 0a  tabase(pParse);.
1acc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1acd0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1ace0 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
1acf0 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20  at prepares for 
1ad00 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  doing an operati
1ad10 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  on that.** might
1ad20 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61   change the data
1ad30 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  base..**.** This
1ad40 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20   routine starts 
1ad50 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
1ad60 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  n if we are not 
1ad70 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a  already within.*
1ad80 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  * a transaction.
1ad90 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65    If we are alre
1ada0 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61  ady within a tra
1adb0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61  nsaction, then a
1adc0 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69   checkpoint.** i
1add0 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74  s set if the set
1ade0 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65  Statement parame
1adf0 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20  ter is true.  A 
1ae00 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
1ae10 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20  d.** be set for 
1ae20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20  operations that 
1ae30 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20  might fail (due 
1ae40 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29  to a constraint)
1ae50 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
1ae60 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20  way through and 
1ae70 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20  which will need 
1ae80 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69  to undo some wri
1ae90 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69  tes without havi
1aea0 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63  ng to.** rollbac
1aeb0 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e  k the whole tran
1aec0 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70  saction.  For op
1aed0 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61  erations where a
1aee0 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  ll constraints.*
1aef0 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64  * can be checked
1af00 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
1af10 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
1af20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74  the database, it
1af30 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63   is never.** nec
1af40 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61  essary to undo a
1af50 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63   write and the c
1af60 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
1af70 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a   not be set..**.
1af80 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65  ** Only database
1af90 20 69 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d   iDb and the tem
1afa0 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d  p database are m
1afb0 61 64 65 20 77 72 69 74 61 62 6c 65 20 62 79 20  ade writable by 
1afc0 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66  this call..** If
1afd0 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68   iDb==0, then th
1afe0 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20  e main and temp 
1aff0 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6d 61  databases are ma
1b000 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49  de writable.   I
1b010 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e  f.** iDb==1 then
1b020 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64   only the temp d
1b030 61 74 61 62 61 73 65 20 69 73 20 6d 61 64 65 20  atabase is made 
1b040 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44  writable.  If iD
1b050 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  b>1 then the.** 
1b060 73 70 65 63 69 66 69 65 64 20 61 75 78 69 6c 69  specified auxili
1b070 61 72 79 20 64 61 74 61 62 61 73 65 20 61 6e 64  ary database and
1b080 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
1b090 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74  se are made writ
1b0a0 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
1b0b0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1b0c0 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
1b0d0 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53  pParse, int setS
1b0e0 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44  tatement, int iD
1b0f0 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
1b100 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1b110 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
1b120 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
1b130 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1b140 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
1b150 44 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77  Db);.  pParse->w
1b160 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69  riteMask |= 1<<i
1b170 44 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74 61  Db;.  if( setSta
1b180 74 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73 65  tement && pParse
1b190 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20  ->nested==0 ){. 
1b1a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b1b0 64 4f 70 31 28 76 2c 20 4f 50 5f 53 74 61 74 65  dOp1(v, OP_State
1b1c0 6d 65 6e 74 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  ment, iDb);.  }.
1b1d0 20 20 69 66 28 20 28 4f 4d 49 54 5f 54 45 4d 50    if( (OMIT_TEMP
1b1e0 44 42 20 7c 7c 20 69 44 62 21 3d 31 29 20 26 26  DB || iDb!=1) &&
1b1f0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
1b200 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20  [1].pBt!=0 ){.  
1b210 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
1b220 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1b230 72 73 65 2c 20 73 65 74 53 74 61 74 65 6d 65 6e  rse, setStatemen
1b240 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t, 1);.  }.}../*
1b250 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
1b260 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20   if pIndex uses 
1b270 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
1b280 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52  quence pColl.  R
1b290 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
1b2a0 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c   it does and fal
1b2b0 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  se if it does no
1b2c0 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
1b2d0 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
1b2e0 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  X.static int col
1b2f0 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73  lationMatch(cons
1b300 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49  t char *zColl, I
1b310 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20  ndex *pIndex){. 
1b320 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1b330 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f  0; i<pIndex->nCo
1b340 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
1b350 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1b360 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
1b370 5d 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 7a 43  ];.    if( z==zC
1b380 6f 6c 6c 20 7c 7c 20 28 7a 20 26 26 20 7a 43 6f  oll || (z && zCo
1b390 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  ll && 0==sqlite3
1b3a0 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c  StrICmp(z, zColl
1b3b0 29 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  )) ){.      retu
1b3c0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b3d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1b3e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
1b3f0 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
1b400 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20 75  s of pTab that u
1b410 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  se the collating
1b420 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
1b430 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  .** If pColl==0 
1b440 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61  then recompute a
1b450 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
1b460 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ab..*/.#ifndef S
1b470 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
1b480 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
1b490 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73  eindexTable(Pars
1b4a0 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
1b4b0 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e   *pTab, char con
1b4c0 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e  st *zColl){.  In
1b4d0 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
1b4e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
1b4f0 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
1b500 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20   with pTab */.. 
1b510 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62   for(pIndex=pTab
1b520 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ->pIndex; pIndex
1b530 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d  ; pIndex=pIndex-
1b540 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1b550 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c   zColl==0 || col
1b560 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c  lationMatch(zCol
1b570 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  l, pIndex) ){.  
1b580 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
1b590 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
1b5a0 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
1b5b0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
1b5c0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
1b5d0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1b5e0 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
1b5f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1b600 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
1b610 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20  , pIndex, -1);. 
1b620 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
1b630 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
1b640 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
1b650 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  f all tables in 
1b660 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68  all databases wh
1b670 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63  ere the.** indic
1b680 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  es use the colla
1b690 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
1b6a0 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d  oll.  If pColl==
1b6b0 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65  0 then recompute
1b6c0 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  .** all indices 
1b6d0 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23  everywhere..*/.#
1b6e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b6f0 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
1b700 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61  c void reindexDa
1b710 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70  tabases(Parse *p
1b720 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73  Parse, char cons
1b730 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20  t *zColl){.  Db 
1b740 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
1b750 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
1b760 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f  ngle database */
1b770 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b790 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  * The database i
1b7a0 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
1b7b0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1b7c0 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
1b7d0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
1b7e0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73  nection */.  Has
1b7f0 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20  hElem *k;       
1b800 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1b810 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62  looping over tab
1b820 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20  les in pDb */.  
1b830 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
1b840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1b850 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
1b860 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72  tabase */..  for
1b870 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e  (iDb=0, pDb=db->
1b880 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  aDb; iDb<db->nDb
1b890 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b  ; iDb++, pDb++){
1b8a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62  .    assert( pDb
1b8b0 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b  !=0 );.    for(k
1b8c0 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
1b8d0 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  (&pDb->pSchema->
1b8e0 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d  tblHash);  k; k=
1b8f0 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b  sqliteHashNext(k
1b900 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d  )){.      pTab =
1b910 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48   (Table*)sqliteH
1b920 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20  ashData(k);.    
1b930 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
1b940 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f  Parse, pTab, zCo
1b950 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ll);.    }.  }.}
1b960 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
1b970 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1b980 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d   the REINDEX com
1b990 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand..**.**     
1b9a0 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20     REINDEX      
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9c0 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20        -- 1.**   
1b9d0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63       REINDEX  <c
1b9e0 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20  ollation>       
1b9f0 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20          -- 2.** 
1ba00 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
1ba10 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61  ?<database>.?<ta
1ba20 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a  blename>  -- 3.*
1ba30 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
1ba40 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
1ba50 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34  indexname>  -- 4
1ba60 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61  .**.** Form 1 ca
1ba70 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  uses all indices
1ba80 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64   in all attached
1ba90 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65   databases to be
1baa0 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72   rebuilt..** For
1bab0 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c  m 2 rebuilds all
1bac0 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
1bad0 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75  databases that u
1bae0 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20  se the named.** 
1baf0 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
1bb00 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64  on.  Forms 3 and
1bb10 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e   4 rebuild the n
1bb20 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c  amed index or al
1bb30 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73  l.** indices ass
1bb40 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1bb50 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f   named table..*/
1bb60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bb70 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69  OMIT_REINDEX.voi
1bb80 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78  d sqlite3Reindex
1bb90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1bba0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54  Token *pName1, T
1bbb0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20  oken *pName2){. 
1bbc0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bbe0 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
1bbf0 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ce to be reindex
1bc00 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ed, or NULL */. 
1bc10 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bc30 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  Name of a table 
1bc40 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f  or index */.  co
1bc50 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  nst char *zDb;  
1bc60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1bc70 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1bc80 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
1bc90 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
1bca0 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
1bcb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
1bcc0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1bcd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1bce0 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
1bcf0 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
1bd00 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1bd30 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
1bd40 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1bd50 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
1bd60 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
1bd70 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  onnection */.  T
1bd80 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20  oken *pObjName; 
1bd90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1bda0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
1bdb0 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72  or index to be r
1bdc0 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f  eindexed */..  /
1bdd0 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
1bde0 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
1bdf0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1be00 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
1be10 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
1be20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
1be30 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
1be40 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
1be50 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
1be60 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
1be70 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1be80 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d  ..  if( pName1==
1be90 30 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d  0 || pName1->z==
1bea0 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  0 ){.    reindex
1beb0 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65  Databases(pParse
1bec0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1bed0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e  ;.  }else if( pN
1bee0 61 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65  ame2==0 || pName
1bef0 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63  2->z==0 ){.    c
1bf00 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20  har *zColl;.    
1bf10 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e  assert( pName1->
1bf20 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d  z );.    zColl =
1bf30 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1bf40 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
1bf50 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69  , pName1);.    i
1bf60 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75  f( !zColl ) retu
1bf70 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  rn;.    pColl = 
1bf80 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
1bf90 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
1bfa0 7a 43 6f 6c 6c 2c 20 2d 31 2c 20 30 29 3b 0a 20  zColl, -1, 0);. 
1bfb0 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
1bfc0 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 20        if( zColl 
1bfd0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 69 6e 64  ){.        reind
1bfe0 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
1bff0 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  se, zColl);.    
1c000 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1c010 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
1c020 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1c030 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
1c040 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1c050 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44  zColl);.  }.  iD
1c060 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
1c070 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
1c080 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
1c090 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
1c0a0 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
1c0b0 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
1c0c0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1c0d0 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
1c0e0 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
1c0f0 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b    zDb = db->aDb[
1c100 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54  iDb].zName;.  pT
1c110 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
1c120 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62  Table(db, z, zDb
1c130 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b  );.  if( pTab ){
1c140 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c  .    reindexTabl
1c150 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
1c160 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
1c170 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
1c180 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1c190 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
1c1a0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c  FindIndex(db, z,
1c1b0 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   zDb);.  sqlite3
1c1c0 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
1c1d0 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
1c1e0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1c1f0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1c200 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
1c210 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
1c220 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
1c230 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72  ndex, -1);.    r
1c240 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
1c250 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1c260 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
1c270 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a  identify the obj
1c280 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65  ect to be reinde
1c290 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  xed");.}.#endif.
1c2a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1c2b0 64 79 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61  dynamicly alloca
1c2c0 74 65 64 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  ted KeyInfo stru
1c2d0 63 74 75 72 65 20 74 68 61 74 20 63 61 6e 20 62  cture that can b
1c2e0 65 20 75 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f  e used.** with O
1c2f0 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50  P_OpenRead or OP
1c300 5f 4f 70 65 6e 57 72 69 74 65 20 74 6f 20 61 63  _OpenWrite to ac
1c310 63 65 73 73 20 64 61 74 61 62 61 73 65 20 69 6e  cess database in
1c320 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex pIdx..**.** 
1c330 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  If successful, a
1c340 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1c350 6e 65 77 20 73 74 72 75 63 74 75 72 65 20 69 73  new structure is
1c360 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
1c370 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 63  is case.** the c
1c380 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
1c390 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
1c3a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1c3b0 62 2c 20 29 20 6f 6e 20 74 68 65 20 72 65 74 75  b, ) on the retu
1c3c0 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72  rned .** pointer
1c3d0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1c3e0 63 75 72 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d  curs (out of mem
1c3f0 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e 67 20 63  ory or missing c
1c400 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71  ollation .** seq
1c410 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20  uence), NULL is 
1c420 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
1c430 20 73 74 61 74 65 20 6f 66 20 70 50 61 72 73 65   state of pParse
1c440 20 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c   updated to refl
1c450 65 63 74 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ect.** the error
1c460 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  ..*/.KeyInfo *sq
1c470 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
1c480 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
1c490 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20   Index *pIdx){. 
1c4a0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
1c4b0 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ol = pIdx->nColu
1c4c0 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73  mn;.  int nBytes
1c4d0 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66   = sizeof(KeyInf
1c4e0 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  o) + (nCol-1)*si
1c4f0 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b  zeof(CollSeq*) +
1c500 20 6e 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33   nCol;.  sqlite3
1c510 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1c520 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  b;.  KeyInfo *pK
1c530 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29  ey = (KeyInfo *)
1c540 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
1c550 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 73 29 3b  ero(db, nBytes);
1c560 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ..  if( pKey ){.
1c570 20 20 20 20 70 4b 65 79 2d 3e 64 62 20 3d 20 70      pKey->db = p
1c580 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70  Parse->db;.    p
1c590 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  Key->aSortOrder 
1c5a0 3d 20 28 75 38 20 2a 29 26 28 70 4b 65 79 2d 3e  = (u8 *)&(pKey->
1c5b0 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20  aColl[nCol]);.  
1c5c0 20 20 61 73 73 65 72 74 28 20 26 70 4b 65 79 2d    assert( &pKey-
1c5d0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c  >aSortOrder[nCol
1c5e0 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70 4b 65 79  ]==&(((u8 *)pKey
1c5f0 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b 0a 20 20  )[nBytes]) );.  
1c600 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
1c610 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; i++){.      c
1c620 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64  har *zColl = pId
1c630 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
1c640 20 20 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c      assert( zCol
1c650 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d  l );.      pKey-
1c660 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69  >aColl[i] = sqli
1c670 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
1c680 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20  (pParse, zColl, 
1c690 2d 31 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d  -1);.      pKey-
1c6a0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
1c6b0 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
1c6c0 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  r[i];.    }.    
1c6d0 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pKey->nField = n
1c6e0 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  Col;.  }..  if( 
1c6f0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
1c700 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1c710 65 28 64 62 2c 20 70 4b 65 79 29 3b 0a 20 20 20  e(db, pKey);.   
1c720 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20   pKey = 0;.  }. 
1c730 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a   return pKey;.}.