/ Hex Artifact Content
Login

Artifact f2edc786b5bf165a7d0949ed3a5872455a610c0e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 34 31 35 20 32 30 30 37 2f 30 33 2f 31 37  1.415 2007/03/17
02f0: 20 31 30 3a 32 36 3a 35 39 20 64 61 6e 69 65 6c   10:26:59 daniel
0300: 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23  k1977 Exp $.*/.#
0310: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0320: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0330: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0340: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0350: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  called when a ne
0360: 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  w SQL statement 
0370: 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  is beginning to.
0380: 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20 20 49  ** be parsed.  I
0390: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 50  nitialize the pP
03a0: 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20 61  arse structure a
03b0: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69  s needed..*/.voi
03c0: 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61  d sqlite3BeginPa
03d0: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
03e0: 65 2c 20 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c  e, int explainFl
03f0: 61 67 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 65  ag){.  pParse->e
0400: 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69 6e  xplain = explain
0410: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
0420: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
0430: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0440: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0450: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0460: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0470: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0480: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0490: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
04a0: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
04b0: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
04c0: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
04d0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
04e0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04f0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
0500: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
0510: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
0520: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
0530: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
0540: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0550: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0560: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0570: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0580: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0590: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
05a0: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
05b0: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
05c0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
05d0: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
05e0: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05f0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
0600: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
0610: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
0620: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
0630: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
0640: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0650: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0660: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0670: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0680: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0690: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
06a0: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
06b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
06c0: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
06d0: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
06e0: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06f0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
0700: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
0710: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
0720: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
0730: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
0740: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0750: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0760: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0770: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0780: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0790: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
07a0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
07b0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
07c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
07d0: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
07e0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07f0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
0800: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
0810: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
0820: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
0830: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
0840: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0850: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0860: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0870: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0880: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0890: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
08a0: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
08b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
08c0: 20 20 69 6e 74 20 6e 42 79 74 65 73 3b 0a 20 20    int nBytes;.  
08d0: 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b 0a 0a 20  TableLock *p;.. 
08e0: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 54   if( 0==sqlite3T
08f0: 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c  hreadDataReadOnl
0900: 79 28 29 2d 3e 75 73 65 53 68 61 72 65 64 44 61  y()->useSharedDa
0910: 74 61 20 7c 7c 20 69 44 62 3c 30 20 29 7b 0a 20  ta || iDb<0 ){. 
0920: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
0930: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
0940: 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b  rse->nTableLock;
0950: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 26   i++){.    p = &
0960: 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f  pParse->aTableLo
0970: 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  ck[i];.    if( p
0980: 2d 3e 69 44 62 3d 3d 69 44 62 20 26 26 20 70 2d  ->iDb==iDb && p-
0990: 3e 69 54 61 62 3d 3d 69 54 61 62 20 29 7b 0a 20  >iTab==iTab ){. 
09a0: 20 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65 4c       p->isWriteL
09b0: 6f 63 6b 20 3d 20 28 70 2d 3e 69 73 57 72 69 74  ock = (p->isWrit
09c0: 65 4c 6f 63 6b 20 7c 7c 20 69 73 57 72 69 74 65  eLock || isWrite
09d0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 65 74  Lock);.      ret
09e0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
09f0: 20 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f    nBytes = sizeo
0a00: 66 28 54 61 62 6c 65 4c 6f 63 6b 29 20 2a 20 28  f(TableLock) * (
0a10: 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f  pParse->nTableLo
0a20: 63 6b 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 52  ck+1);.  sqliteR
0a30: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 28 76 6f  eallocOrFree((vo
0a40: 69 64 20 2a 2a 29 26 70 50 61 72 73 65 2d 3e 61  id **)&pParse->a
0a50: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
0a60: 73 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  s);.  if( pParse
0a70: 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 29 7b 0a  ->aTableLock ){.
0a80: 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d      p = &pParse-
0a90: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 70 50 61 72  >aTableLock[pPar
0aa0: 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b 2b  se->nTableLock++
0ab0: 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d 20  ];.    p->iDb = 
0ac0: 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62  iDb;.    p->iTab
0ad0: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e   = iTab;.    p->
0ae0: 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69 73  isWriteLock = is
0af0: 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20 70  WriteLock;.    p
0b00: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
0b10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
0b20: 64 65 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f  de an OP_TableLo
0b30: 63 6b 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66  ck instruction f
0b40: 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f  or each table lo
0b50: 63 6b 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73  cked by the.** s
0b60: 74 61 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67  tatement (config
0b70: 75 72 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  ured by calls to
0b80: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0b90: 6b 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  k())..*/.static 
0ba0: 76 6f 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f  void codeTableLo
0bb0: 63 6b 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  cks(Parse *pPars
0bc0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56  e){.  int i;.  V
0bd0: 64 62 65 20 2a 70 56 64 62 65 3b 20 0a 20 20 61  dbe *pVdbe; .  a
0be0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 54 68  ssert( sqlite3Th
0bf0: 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79  readDataReadOnly
0c00: 28 29 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74  ()->useSharedDat
0c10: 61 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 54 61  a || pParse->nTa
0c20: 62 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  bleLock==0 );.. 
0c30: 20 69 66 28 20 30 3d 3d 28 70 56 64 62 65 20 3d   if( 0==(pVdbe =
0c40: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0c50: 70 50 61 72 73 65 29 29 20 29 7b 0a 20 20 20 20  pParse)) ){.    
0c60: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66  return;.  }..  f
0c70: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
0c80: 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b  ->nTableLock; i+
0c90: 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f 63  +){.    TableLoc
0ca0: 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e  k *p = &pParse->
0cb0: 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20  aTableLock[i];. 
0cc0: 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e 69     int p1 = p->i
0cd0: 44 62 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  Db;.    if( p->i
0ce0: 73 57 72 69 74 65 4c 6f 63 6b 20 29 7b 0a 20 20  sWriteLock ){.  
0cf0: 20 20 20 20 70 31 20 3d 20 2d 31 2a 28 70 31 2b      p1 = -1*(p1+
0d00: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  1);.    }.    sq
0d10: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 70 56 64  lite3VdbeOp3(pVd
0d20: 62 65 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b  be, OP_TableLock
0d30: 2c 20 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70  , p1, p->iTab, p
0d40: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
0d50: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
0d60: 0a 20 20 23 64 65 66 69 6e 65 20 63 6f 64 65 54  .  #define codeT
0d70: 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a 23 65 6e  ableLocks(x).#en
0d80: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
0d90: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
0da0: 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  d after a single
0db0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
0dc0: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65  as been.** parse
0dd0: 64 20 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f  d and a VDBE pro
0de0: 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20  gram to execute 
0df0: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68  that statement h
0e00: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61  as been.** prepa
0e10: 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  red.  This routi
0e20: 6e 65 20 70 75 74 73 20 74 68 65 20 66 69 6e 69  ne puts the fini
0e30: 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e  shing touches on
0e40: 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
0e50: 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20  gram and resets 
0e60: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0e70: 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78  ture for the nex
0e80: 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a  t.** parse..**.*
0e90: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
0ea0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
0eb0: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
0ec0: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
0ed0: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0ee0: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0ef0: 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  id sqlite3Finish
0f00: 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50  Coding(Parse *pP
0f10: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
0f20: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
0f30: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d  ..  if( sqlite3M
0f40: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20  allocFailed() ) 
0f50: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
0f60: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72  arse->nested ) r
0f70: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50  eturn;.  if( !pP
0f80: 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
0f90: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72     if( pParse->r
0fa0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
0fb0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
0fc0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
0fd0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
0fe0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
0ff0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42     }.  }..  /* B
1000: 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69  egin by generati
1010: 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74  ng some terminat
1020: 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20  ion code at the 
1030: 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  end of the.  ** 
1040: 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a  vdbe program.  *
1050: 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
1060: 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74  >db;.  v = sqlit
1070: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1080: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1090: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10a0: 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30  Op(v, OP_Halt, 0
10b0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  , 0);..    /* Th
10c0: 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f  e cookie mask co
10d0: 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20 66  ntains one bit f
10e0: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
10f0: 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20   file open..    
1100: 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f 72  ** (Bit 0 is for
1110: 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73 20   main, bit 1 is 
1120: 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f  for temp, and so
1130: 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20 61   forth.)  Bits a
1140: 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66 6f  re.    ** set fo
1150: 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  r each database 
1160: 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20 47  that is used.  G
1170: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1180: 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20 74  start a.    ** t
1190: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61  ransaction on ea
11a0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
11b0: 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20 74   and to verify t
11c0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
11d0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20  .    ** on each 
11e0: 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  used database.. 
11f0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
1200: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
1210: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20  >0 ){.      u32 
1220: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20  mask;.      int 
1230: 69 44 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  iDb;.      sqlit
1240: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1250: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
1260: 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20 20 20 66  Goto-1);.      f
1270: 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d 31  or(iDb=0, mask=1
1280: 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 6d  ; iDb<db->nDb; m
1290: 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29 7b  ask<<=1, iDb++){
12a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 61  .        if( (ma
12b0: 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f 6f  sk & pParse->coo
12c0: 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63 6f  kieMask)==0 ) co
12d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
12e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12f0: 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
1300: 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20 26  on, iDb, (mask &
1310: 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61   pParse->writeMa
1320: 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  sk)!=0);.       
1330: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1340: 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f  p(v, OP_VerifyCo
1350: 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72 73  okie, iDb, pPars
1360: 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  e->cookieValue[i
1370: 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69  Db]);.      }.#i
1380: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1390: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
13a0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
13b0: 3e 70 56 69 72 74 75 61 6c 4c 6f 63 6b 20 29 7b  >pVirtualLock ){
13c0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76  .        char *v
13d0: 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29 70 50  tab = (char *)pP
13e0: 61 72 73 65 2d 3e 70 56 69 72 74 75 61 6c 4c 6f  arse->pVirtualLo
13f0: 63 6b 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20  ck->pVtab;.     
1400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
1410: 33 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20  3(v, OP_VBegin, 
1420: 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 33 5f 56  0, 0, vtab, P3_V
1430: 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  TAB);.      }.#e
1440: 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f  ndif..      /* O
1450: 6e 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b  nce all the cook
1460: 69 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65  ies have been ve
1470: 72 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73  rified and trans
1480: 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20  actions opened, 
1490: 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e  .      ** obtain
14a0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
14b0: 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20  ble-locks. This 
14c0: 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73  is a no-op unles
14d0: 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  s the .      ** 
14e0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61  shared-cache fea
14f0: 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  ture is enabled.
1500: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1510: 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  codeTableLocks(p
1520: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1530: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1540: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50  , OP_Goto, 0, pP
1550: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
1560: 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  );.    }..#ifnde
1570: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
1580: 41 43 45 0a 20 20 20 20 2f 2a 20 41 64 64 20 61  ACE.    /* Add a
1590: 20 4e 6f 2d 6f 70 20 74 68 61 74 20 63 6f 6e 74   No-op that cont
15a0: 61 69 6e 73 20 74 68 65 20 63 6f 6d 70 6c 65 74  ains the complet
15b0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f  e text of the co
15c0: 6d 70 69 6c 65 64 20 53 51 4c 0a 20 20 20 20 2a  mpiled SQL.    *
15d0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 69  * statement as i
15e0: 74 73 20 50 33 20 61 72 67 75 6d 65 6e 74 2e 20  ts P3 argument. 
15f0: 20 54 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 63   This does not c
1600: 68 61 6e 67 65 20 74 68 65 20 66 75 6e 63 74 69  hange the functi
1610: 6f 6e 61 6c 69 74 79 0a 20 20 20 20 2a 2a 20 6f  onality.    ** o
1620: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 0a  f the program. .
1630: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1640: 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  is is used to im
1650: 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f  plement sqlite3_
1660: 74 72 61 63 65 28 29 2e 0a 20 20 20 20 2a 2f 0a  trace()..    */.
1670: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
1680: 70 33 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30  p3(v, OP_Noop, 0
1690: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 7a 53 71  , 0, pParse->zSq
16a0: 6c 2c 20 70 50 61 72 73 65 2d 3e 7a 54 61 69 6c  l, pParse->zTail
16b0: 2d 70 50 61 72 73 65 2d 3e 7a 53 71 6c 29 3b 0a  -pParse->zSql);.
16c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
16d0: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 20  _OMIT_TRACE */. 
16e0: 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68   }...  /* Get th
16f0: 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72  e VDBE program r
1700: 65 61 64 79 20 66 6f 72 20 65 78 65 63 75 74 69  eady for executi
1710: 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20  on.  */.  if( v 
1720: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
1730: 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 4d 61  =0 && !sqlite3Ma
1740: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
1750: 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20      FILE *trace 
1760: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
1770: 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 29  QLITE_VdbeTrace)
1780: 21 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a 20 30  !=0 ? stdout : 0
1790: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17a0: 65 54 72 61 63 65 28 76 2c 20 74 72 61 63 65 29  eTrace(v, trace)
17b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17c0: 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50  eMakeReady(v, pP
17d0: 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70 50 61 72  arse->nVar, pPar
17e0: 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a 20 20 20 20  se->nMem+3,.    
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
1810: 62 2b 33 2c 20 70 50 61 72 73 65 2d 3e 65 78 70  b+3, pParse->exp
1820: 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61 72 73  lain);.    pPars
1830: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44  e->rc = SQLITE_D
1840: 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ONE;.    pParse-
1850: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30  >colNamesSet = 0
1860: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
1870: 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  arse->rc==SQLITE
1880: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72 73  _OK ){.    pPars
1890: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
18a0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72  RROR;.  }.  pPar
18b0: 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20  se->nTab = 0;.  
18c0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30  pParse->nMem = 0
18d0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74  ;.  pParse->nSet
18e0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
18f0: 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72  nVar = 0;.  pPar
1900: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d  se->cookieMask =
1910: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   0;.  pParse->co
1920: 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a  okieGoto = 0;.}.
1930: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1940: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1950: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
1960: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
1970: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
1980: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
1990: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
19a0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
19b0: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
19c0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
19d0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
19e0: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
19f0: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1a00: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1a10: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1a20: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1a30: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1a40: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
1a50: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
1a60: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
1a70: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
1a80: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
1a90: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
1aa0: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1ab0: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1ac0: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1ad0: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1ae0: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1af0: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1b00: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1b10: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1b20: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1b30: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1b40: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
1b50: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
1b60: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
1b70: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
1b80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1b90: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
1ba0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1bb0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1bc0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1bd0: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
1be0: 3b 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f  ;.# define SAVE_
1bf0: 53 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73  SZ  (sizeof(Pars
1c00: 65 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61  e) - offsetof(Pa
1c10: 72 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61  rse,nVar)).  cha
1c20: 72 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53  r saveBuf[SAVE_S
1c30: 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Z];..  if( pPars
1c40: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
1c50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1c60: 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b  se->nested<10 );
1c70: 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f    /* Nesting sho
1c80: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c  uld only be of l
1c90: 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a  imited depth */.
1ca0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
1cb0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20  Format);.  zSql 
1cc0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
1cd0: 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  f(zFormat, ap);.
1ce0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
1cf0: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
1d00: 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20     return;   /* 
1d10: 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  A malloc must ha
1d20: 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d  ve failed */.  }
1d30: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  .  pParse->neste
1d40: 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61  d++;.  memcpy(sa
1d50: 76 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e  veBuf, &pParse->
1d60: 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  nVar, SAVE_SZ);.
1d70: 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65    memset(&pParse
1d80: 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f  ->nVar, 0, SAVE_
1d90: 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75  SZ);.  sqlite3Ru
1da0: 6e 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20  nParser(pParse, 
1db0: 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 73 71 6c 69  zSql, 0);.  sqli
1dc0: 74 65 46 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  teFree(zSql);.  
1dd0: 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e  memcpy(&pParse->
1de0: 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53  nVar, saveBuf, S
1df0: 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73  AVE_SZ);.  pPars
1e00: 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a  e->nested--;.}..
1e10: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
1e20: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
1e30: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
1e40: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
1e50: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
1e60: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
1e70: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
1e80: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
1e90: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1ea0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
1eb0: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
1ec0: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
1ed0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
1ee0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
1ef0: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
1f00: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
1f10: 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  d for the table 
1f20: 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  and the.** first
1f30: 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20   matching table 
1f40: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
1f50: 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64  o checking for d
1f60: 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a  uplicate table.*
1f70: 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  * names is done.
1f80: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
1f90: 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73  der is TEMP firs
1fa0: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
1fb0: 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69  en any.** auxili
1fc0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
1fd0: 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54  ded using the AT
1fe0: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  TACH command..**
1ff0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
2000: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
2010: 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  )..*/.Table *sql
2020: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71  ite3FindTable(sq
2030: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
2040: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
2050: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62  nst char *zDatab
2060: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
2070: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
2080: 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d   assert( zName!=
2090: 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  0 );.  for(i=OMI
20a0: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
20b0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
20c0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
20d0: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
20e0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
20f0: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
2100: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20  zDatabase!=0 && 
2110: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2120: 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44  Database, db->aD
2130: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
2140: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20  ntinue;.    p = 
2150: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2160: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68  &db->aDb[j].pSch
2170: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  ema->tblHash, zN
2180: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
2190: 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70  e)+1);.    if( p
21a0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
21b0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
21c0: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
21d0: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
21e0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
21f0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
2200: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
2210: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
2220: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
2230: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
2240: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
2250: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
2260: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
2270: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
2280: 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f  not found.  Also
2290: 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72   leave an.** err
22a0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
22b0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
22c0: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
22d0: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
22e0: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c   routine and sql
22f0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
2300: 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
2310: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
2320: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2330: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
2340: 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69  sg where.** sqli
2350: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64  te3FindTable() d
2360: 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c  oes not..*/.Tabl
2370: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
2380: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
2390: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
23a0: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
23b0: 61 72 20 2a 7a 44 62 61 73 65 29 7b 0a 20 20 54  ar *zDbase){.  T
23c0: 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52  able *p;..  /* R
23d0: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
23e0: 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
23f0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
2400: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
2410: 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
2420: 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
2430: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
2440: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
2450: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
2460: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
2470: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2480: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
2490: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
24a0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73  db, zName, zDbas
24b0: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
24c0: 7b 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73 65  {.    if( zDbase
24d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
24e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
24f0: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
2500: 3a 20 25 73 2e 25 73 22 2c 20 7a 44 62 61 73 65  : %s.%s", zDbase
2510: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
2520: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2530: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2540: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
2550: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
2560: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
2570: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
2580: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
2590: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
25a0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
25b0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
25c0: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
25d0: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
25e0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
25f0: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
2600: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
2610: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
2620: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
2630: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
2640: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
2650: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
2660: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
2670: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
2680: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
2690: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
26a0: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
26b0: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
26c0: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
26d0: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
26e0: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
26f0: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
2700: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
2710: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
2720: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
2730: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
2740: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
2750: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
2760: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
2770: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
2780: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  x(sqlite3 *db, c
2790: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
27a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
27b0: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  b){.  Index *p =
27c0: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
27d0: 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42  or(i=OMIT_TEMPDB
27e0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
27f0: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
2800: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
2810: 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20   /* Search TEMP 
2820: 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20  before MAIN */. 
2830: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
2840: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ma = db->aDb[j].
2850: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28  pSchema;.    if(
2860: 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53   zDb && sqlite3S
2870: 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e  trICmp(zDb, db->
2880: 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20  aDb[j].zName) ) 
2890: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
28a0: 73 65 72 74 28 20 70 53 63 68 65 6d 61 20 7c 7c  sert( pSchema ||
28b0: 20 28 6a 3d 3d 31 20 26 26 20 21 64 62 2d 3e 61   (j==1 && !db->a
28c0: 44 62 5b 31 5d 2e 70 42 74 29 20 29 3b 0a 20 20  Db[1].pBt) );.  
28d0: 20 20 69 66 28 20 70 53 63 68 65 6d 61 20 29 7b    if( pSchema ){
28e0: 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74  .      p = sqlit
28f0: 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68  e3HashFind(&pSch
2900: 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e  ema->idxHash, zN
2910: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
2920: 65 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e)+1);.    }.   
2930: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
2940: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
2950: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
2960: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
2970: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
2980: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
2990: 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b  Index(Index *p){
29a0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d  .  sqliteFree(p-
29b0: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
29c0: 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f  iteFree(p);.}../
29d0: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
29e0: 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d  given index from
29f0: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
2a00: 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a  table, and free.
2a10: 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74  ** its memory st
2a20: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  ructures..**.** 
2a30: 54 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d  The index is rem
2a40: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  oved from the da
2a50: 74 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c  tabase hash tabl
2a60: 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20  es but.** it is 
2a70: 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  not unlinked fro
2a80: 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68 61 74  m the Table that
2a90: 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20   it indexes..** 
2aa0: 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74  Unlinking from t
2ab0: 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65  he Table must be
2ac0: 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c   done by the cal
2ad0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
2ae0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2af0: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
2b00: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64  Index *p){.  Ind
2b10: 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e 73  ex *pOld;.  cons
2b20: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
2b30: 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f 6c  p->zName;..  pOl
2b40: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
2b50: 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d  nsert(&p->pSchem
2b60: 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  a->idxHash, zNam
2b70: 65 2c 20 73 74 72 6c 65 6e 28 20 7a 4e 61 6d 65  e, strlen( zName
2b80: 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  )+1, 0);.  asser
2b90: 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f  t( pOld==0 || pO
2ba0: 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65 65 49  ld==p );.  freeI
2bb0: 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ndex(p);.}../*.*
2bc0: 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20  * For the index 
2bd0: 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20  called zIdxName 
2be0: 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69  which is found i
2bf0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
2c00: 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68  Db,.** unlike th
2c10: 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74  at index from it
2c20: 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d  s Table then rem
2c30: 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72  ove the index fr
2c40: 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  om.** the index 
2c50: 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66  hash table and f
2c60: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73  ree all memory s
2c70: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
2c80: 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
2c90: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
2ca0: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
2cb0: 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69  DeleteIndex(sqli
2cc0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
2cd0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
2ce0: 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  dxName){.  Index
2cf0: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20   *pIndex;.  int 
2d00: 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70 48 61  len;.  Hash *pHa
2d10: 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  sh = &db->aDb[iD
2d20: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b].pSchema->idxH
2d30: 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74  ash;..  len = st
2d40: 72 6c 65 6e 28 7a 49 64 78 4e 61 6d 65 29 3b 0a  rlen(zIdxName);.
2d50: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
2d60: 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61  e3HashInsert(pHa
2d70: 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65  sh, zIdxName, le
2d80: 6e 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  n+1, 0);.  if( p
2d90: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66 28  Index ){.    if(
2da0: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
2db0: 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20  >pIndex==pIndex 
2dc0: 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
2dd0: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20  >pTable->pIndex 
2de0: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
2df0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e00: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
2e10: 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e    for(p=pIndex->
2e20: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
2e30: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  p && p->pNext!=p
2e40: 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78  Index; p=p->pNex
2e50: 74 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 70  t){}.      if( p
2e60: 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49   && p->pNext==pI
2e70: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  ndex ){.        
2e80: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  p->pNext = pInde
2e90: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
2ea0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
2eb0: 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20  Index(pIndex);. 
2ec0: 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c   }.  db->flags |
2ed0: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
2ee0: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
2ef0: 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d   Erase all schem
2f00: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
2f10: 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  om the in-memory
2f20: 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a   hash tables of.
2f30: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  ** a single data
2f40: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
2f50: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
2f60: 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a   reclaim memory.
2f70: 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64 61  ** before the da
2f80: 74 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20 20  tabase closes.  
2f90: 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65  It is also calle
2fa0: 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  d during a rollb
2fb0: 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ack.** if there 
2fc0: 77 65 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e  were schema chan
2fd0: 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74  ges during the t
2fe0: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69 66  ransaction or if
2ff0: 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f   a.** schema-coo
3000: 6b 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63 63  kie mismatch occ
3010: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  urs..**.** If iD
3020: 62 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20  b<=0 then reset 
3030: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
3040: 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61  ema tables for a
3050: 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ll database.** f
3060: 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32  iles.  If iDb>=2
3070: 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
3080: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
3090: 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  for only the.** 
30a0: 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69  single file indi
30b0: 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cated..*/.void s
30c0: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
30d0: 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65  nalSchema(sqlite
30e0: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b  3 *db, int iDb){
30f0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20  .  int i, j;..  
3100: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
3110: 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
3120: 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c  .  for(i=iDb; i<
3130: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3140: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
3150: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
3160: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29  ( pDb->pSchema )
3170: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
3180: 63 68 65 6d 61 46 72 65 65 28 70 44 62 2d 3e 70  chemaFree(pDb->p
3190: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
31a0: 20 20 20 69 66 28 20 69 44 62 3e 30 20 29 20 72     if( iDb>0 ) r
31b0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
31c0: 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20  ert( iDb==0 );. 
31d0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
31e0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
31f0: 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  ges;..  /* If on
3200: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
3210: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
3220: 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65  ase files has be
3230: 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20  en closed,.  ** 
3240: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6d  then remove them
3250: 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69   from the auxili
3260: 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73  ary database lis
3270: 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a  t.  We take the.
3280: 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79    ** opportunity
3290: 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65   to do this here
32a0: 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a   since we have j
32b0: 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20  ust deleted all 
32c0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65  of the.  ** sche
32d0: 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  ma hash tables a
32e0: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20  nd therefore do 
32f0: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65  not have to make
3300: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a   any changes.  *
3310: 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73  * to any of thos
3320: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
3330: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
3340: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nDb; i++){.    s
3350: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
3360: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
3370: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30   if( pDb->pBt==0
3380: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
3390: 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d 3e  b->pAux && pDb->
33a0: 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d 3e  xFreeAux ) pDb->
33b0: 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70 41  xFreeAux(pDb->pA
33c0: 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ux);.      pDb->
33d0: 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pAux = 0;.    }.
33e0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b    }.  for(i=j=2;
33f0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
3400: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
3410: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
3420: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
3430: 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >pBt==0 ){.     
3440: 20 73 71 6c 69 74 65 46 72 65 65 28 70 44 62 2d   sqliteFree(pDb-
3450: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  >zName);.      p
3460: 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  Db->zName = 0;. 
3470: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
3480: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69     }.    if( j<i
3490: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   ){.      db->aD
34a0: 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  b[j] = db->aDb[i
34b0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b  ];.    }.    j++
34c0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
34d0: 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28  db->aDb[j], 0, (
34e0: 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f  db->nDb-j)*sizeo
34f0: 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a  f(db->aDb[j]));.
3500: 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20    db->nDb = j;. 
3510: 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20   if( db->nDb<=2 
3520: 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e  && db->aDb!=db->
3530: 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20  aDbStatic ){.   
3540: 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53   memcpy(db->aDbS
3550: 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20  tatic, db->aDb, 
3560: 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  2*sizeof(db->aDb
3570: 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  [0]));.    sqlit
3580: 65 46 72 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a  eFree(db->aDb);.
3590: 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62      db->aDb = db
35a0: 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d  ->aDbStatic;.  }
35b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
35c0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
35d0: 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
35e0: 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49 66  back occurs.  If
35f0: 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20 73   there were.** s
3600: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75  chema changes du
3610: 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ring the transac
3620: 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68 61  tion, then we ha
3630: 76 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 0a  ve to reset the.
3640: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  ** internal hash
3650: 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f   tables and relo
3660: 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69 73  ad them from dis
3670: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
3680: 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  e3RollbackIntern
3690: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
36a0: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
36b0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
36c0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
36d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
36e0: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
36f0: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  (db, 0);.  }.}..
3700: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3710: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
3720: 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72  n a commit occur
3730: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
3740: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
3750: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
3760: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67  *db){.  db->flag
3770: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
3780: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
3790: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
37a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
37b0: 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
37c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
37d0: 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75   sqliteResetColu
37e0: 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70  mnNames(Table *p
37f0: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
3800: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
3810: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
3820: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  e!=0 );.  if( (p
3830: 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43  Col = pTable->aC
3840: 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  ol)!=0 ){.    fo
3850: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d  r(i=0; i<pTable-
3860: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
3870: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
3880: 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  eFree(pCol->zNam
3890: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
38a0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f 6c  3ExprDelete(pCol
38b0: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
38c0: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
38d0: 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 73  >zType);.      s
38e0: 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e  qliteFree(pCol->
38f0: 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
3900: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
3910: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a  ble->aCol);.  }.
3920: 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
3930: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43   0;.  pTable->nC
3940: 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ol = 0;.}../*.**
3950: 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f   Remove the memo
3960: 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ry data structur
3970: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3980: 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  th the given.** 
3990: 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67  Table.  No chang
39a0: 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64  es are made to d
39b0: 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74  isk by this rout
39c0: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ine..**.** This 
39d0: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c  routine just del
39e0: 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74  etes the data st
39f0: 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65  ructure.  It doe
3a00: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20  s not unlink.** 
3a10: 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73  the table data s
3a20: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
3a30: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e  e hash table.  N
3a40: 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76  or does it remov
3a50: 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79  e.** foreign key
3a60: 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74  s from the sqlit
3a70: 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62  e.aFKey hash tab
3a80: 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73  le.  But it does
3a90: 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f   destroy.** memo
3aa0: 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66  ry structures of
3ab0: 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64   the indices and
3ac0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73   foreign keys as
3ad0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a  sociated with .*
3ae0: 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  * the table..**.
3af0: 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73 6f 63  ** Indices assoc
3b00: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
3b10: 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65  able are unlinke
3b20: 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62 22 0a  d from the "db".
3b30: 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ** data structur
3b40: 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20  e if db!=NULL.  
3b50: 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64  If db==NULL, ind
3b60: 69 63 65 73 20 61 74 74 61 63 68 65 64 20 74 6f  ices attached to
3b70: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 61 72  .** the table ar
3b80: 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74 20 69  e deleted, but i
3b90: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 65  t is assumed the
3ba0: 79 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  y have already b
3bb0: 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e  een.** unlinked.
3bc0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3bd0: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
3be0: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
3bf0: 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78  pTable){.  Index
3c00: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74   *pIndex, *pNext
3c10: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c  ;.  FKey *pFKey,
3c20: 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20   *pNextFKey;..  
3c30: 64 62 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  db = 0;..  if( p
3c40: 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72  Table==0 ) retur
3c50: 6e 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  n;..  /* Do not 
3c60: 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65  delete the table
3c70: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72   until the refer
3c80: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
3c90: 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 70 54  es zero. */.  pT
3ca0: 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  able->nRef--;.  
3cb0: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  if( pTable->nRef
3cc0: 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
3cd0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
3ce0: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20  pTable->nRef==0 
3cf0: 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  );..  /* Delete 
3d00: 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f  all indices asso
3d10: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
3d20: 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f   table.  */.  fo
3d30: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
3d40: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
3d50: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
3d60: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
3d70: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
3d80: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
3d90: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65  >pSchema==pTable
3da0: 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
3db0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64   sqliteDeleteInd
3dc0: 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  ex(pIndex);.  }.
3dd0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3de0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
3df0: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
3e00: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73   foreign keys as
3e10: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
3e20: 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b  is table.  The k
3e30: 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  eys.  ** should 
3e40: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
3e50: 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  n unlinked from 
3e60: 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68 61  the db->aFKey ha
3e70: 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20  sh table .  */. 
3e80: 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c   for(pFKey=pTabl
3e90: 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b  e->pFKey; pFKey;
3ea0: 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79   pFKey=pNextFKey
3eb0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79  ){.    pNextFKey
3ec0: 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46   = pFKey->pNextF
3ed0: 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rom;.    assert(
3ee0: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
3ef0: 28 26 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d  (&pTable->pSchem
3f00: 61 2d 3e 61 46 4b 65 79 2c 0a 20 20 20 20 20 20  a->aFKey,.      
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f20: 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c       pFKey->zTo,
3f30: 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a   strlen(pFKey->z
3f40: 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b  To)+1)!=pFKey );
3f50: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
3f60: 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64  pFKey);.  }.#end
3f70: 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  if..  /* Delete 
3f80: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
3f90: 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ure itself..  */
3fa0: 0a 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f  .  sqliteResetCo
3fb0: 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 6c 65  lumnNames(pTable
3fc0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
3fd0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
3fe0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
3ff0: 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  ble->zColAff);. 
4000: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
4010: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65  lete(pTable->pSe
4020: 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  lect);.#ifndef S
4030: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
4040: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
4050: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 43 68  lete(pTable->pCh
4060: 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  eck);.#endif.  s
4070: 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28  qlite3VtabClear(
4080: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
4090: 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d  eFree(pTable);.}
40a0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74  ../*.** Unlink t
40b0: 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66  he given table f
40c0: 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62  rom the hash tab
40d0: 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65  les and the dele
40e0: 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  te the.** table 
40f0: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 61  structure with a
4100: 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61  ll its indices a
4110: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e  nd foreign keys.
4120: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4130: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54  UnlinkAndDeleteT
4140: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
4150: 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74  , int iDb, const
4160: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29   char *zTabName)
4170: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
4180: 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46 32 3b  FKey *pF1, *pF2;
4190: 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61  .  Db *pDb;..  a
41a0: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
41b0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
41c0: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
41d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61  );.  assert( zTa
41e0: 62 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e 61 6d  bName && zTabNam
41f0: 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20 3d 20  e[0] );.  pDb = 
4200: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
4210: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
4220: 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63  Insert(&pDb->pSc
4230: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a  hema->tblHash, z
4240: 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  TabName, strlen(
4250: 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 30 29 3b 0a  zTabName)+1,0);.
4260: 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66 6e 64    if( p ){.#ifnd
4270: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
4280: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66  OREIGN_KEY.    f
4290: 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b  or(pF1=p->pFKey;
42a0: 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70   pF1; pF1=pF1->p
42b0: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20  NextFrom){.     
42c0: 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65   int nTo = strle
42d0: 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b  n(pF1->zTo) + 1;
42e0: 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73 71 6c  .      pF2 = sql
42f0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 44  ite3HashFind(&pD
4300: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65  b->pSchema->aFKe
4310: 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f  y, pF1->zTo, nTo
4320: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 32  );.      if( pF2
4330: 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20 20 20  ==pF1 ){.       
4340: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
4350: 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  rt(&pDb->pSchema
4360: 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ->aFKey, pF1->zT
4370: 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65  o, nTo, pF1->pNe
4380: 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xtTo);.      }el
4390: 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  se{.        whil
43a0: 65 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70  e( pF2 && pF2->p
43b0: 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70  NextTo!=pF1 ){ p
43c0: 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b  F2=pF2->pNextTo;
43d0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
43e0: 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  F2 ){.          
43f0: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  pF2->pNextTo = p
4400: 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20  F1->pNextTo;.   
4410: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
4420: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
4430: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
4440: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 20  le(db, p);.  }. 
4450: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
4460: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
4470: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  es;.}../*.** Giv
4480: 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75  en a token, retu
4490: 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  rn a string that
44a0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
44b0: 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a   text of that.**
44c0: 20 74 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20   token with any 
44d0: 71 75 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76  quotations remov
44e0: 65 64 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  ed.  Space to ho
44f0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
4500: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
4510: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
4520: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
4530: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
4540: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
4550: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f  nction..**.** To
4560: 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a  kens are often j
4570: 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74  ust pointers int
4580: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  o the original S
4590: 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a  QL text and so.*
45a0: 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74  * are not \000 t
45b0: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72  erminated and ar
45c0: 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74  e not persistent
45d0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  .  The returned 
45e0: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30  string.** is \00
45f0: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
4600: 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a   is persistent..
4610: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
4620: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f  NameFromToken(To
4630: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63  ken *pName){.  c
4640: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
4650: 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
4660: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
4670: 4e 44 75 70 28 28 63 68 61 72 2a 29 70 4e 61 6d  NDup((char*)pNam
4680: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
4690: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
46a0: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ote(zName);.  }e
46b0: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
46c0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
46d0: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
46e0: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
46f0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
4700: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
4710: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
4720: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
4730: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
4740: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
4750: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
4760: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50  penMasterTable(P
4770: 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  arse *p, int iDb
4780: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
4790: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29  qlite3GetVdbe(p)
47a0: 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
47b0: 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53  Lock(p, iDb, MAS
47c0: 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53 43 48  TER_ROOT, 1, SCH
47d0: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b  EMA_TABLE(iDb));
47e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
47f0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
4800: 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 73 71  r, iDb, 0);.  sq
4810: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4820: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
4830: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 29 3b  0, MASTER_ROOT);
4840: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
4850: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
4860: 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 20  Columns, 0, 5); 
4870: 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  /* sqlite_master
4880: 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a   has 5 columns *
4890: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  /.}../*.** The t
48a0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74  oken *pName cont
48b0: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ains the name of
48c0: 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74   a database (eit
48d0: 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a  her "main" or.**
48e0: 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e   "temp" or the n
48f0: 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68  ame of an attach
4900: 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75  ed db). This rou
4910: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
4920: 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65  .** index of the
4930: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
4940: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
4950: 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64   -1 if the named
4960: 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   db .** does not
4970: 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73   exist..*/.int s
4980: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c  qlite3FindDb(sql
4990: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
49a0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *pName){.  int i
49b0: 20 3d 20 2d 31 3b 20 20 20 20 2f 2a 20 44 61 74   = -1;    /* Dat
49c0: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
49d0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
49e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
49f0: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
4a00: 6e 61 6d 65 20 2a 2f 0a 20 20 44 62 20 2a 70 44  name */.  Db *pD
4a10: 62 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 64 61  b;       /* A da
4a20: 74 61 62 61 73 65 20 77 68 6f 73 65 20 6e 61 6d  tabase whose nam
4a30: 65 20 73 70 61 63 65 20 69 73 20 62 65 69 6e 67  e space is being
4a40: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63   searched */.  c
4a50: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a  har *zName;   /*
4a60: 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61   Name we are sea
4a70: 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20  rching for */.. 
4a80: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
4a90: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e  NameFromToken(pN
4aa0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
4ab0: 65 20 29 7b 0a 20 20 20 20 6e 20 3d 20 73 74 72  e ){.    n = str
4ac0: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  len(zName);.    
4ad0: 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31  for(i=(db->nDb-1
4ae0: 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b  ), pDb=&db->aDb[
4af0: 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  i]; i>=0; i--, p
4b00: 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28  Db--){.      if(
4b10: 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c   (!OMIT_TEMPDB |
4b20: 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73  | i!=1 ) && n==s
4b30: 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61 6d 65  trlen(pDb->zName
4b40: 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  ) && .          
4b50: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
4b60: 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  p(pDb->zName, zN
4b70: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
4b80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4b90: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
4ba0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  ree(zName);.  }.
4bb0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
4bc0: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
4bd0: 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e  iew or trigger n
4be0: 61 6d 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ame is passed to
4bf0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
4c00: 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d  a tokens.** pNam
4c10: 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49  e1 and pName2. I
4c20: 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  f the table name
4c30: 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69   was fully quali
4c40: 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  fied, for exampl
4c50: 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  e:.**.** CREATE 
4c60: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
4c70: 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e  ..);.** .** Then
4c80: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
4c90: 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d  o "xxx" and pNam
4ca0: 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65  e2 "yyy". On the
4cb0: 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a   other hand if.*
4cc0: 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
4cd0: 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75   is not fully qu
4ce0: 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a  alified, i.e.:.*
4cf0: 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c  *.** CREATE TABL
4d00: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a  E yyy(...);.**.*
4d10: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
4d20: 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e   set to "yyy" an
4d30: 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a  d pName2 is ""..
4d40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
4d50: 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70 70 55  ne sets the *ppU
4d60: 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f  nqual pointer to
4d70: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
4d80: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a  ken (pName1 or.*
4d90: 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73  * pName2) that s
4da0: 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c  tores the unqual
4db0: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
4dc0: 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20  .  The index of 
4dd0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
4de0: 22 78 78 78 22 20 69 73 20 72 65 74 75 72 6e 65  "xxx" is returne
4df0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
4e00: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20  3TwoPartName(.  
4e10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4e20: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
4e30: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
4e40: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
4e50: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
4e60: 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22      /* The "xxx"
4e70: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78   in the name "xx
4e80: 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22 20  x.yyy" or "xxx" 
4e90: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
4ea0: 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e2,      /* The 
4eb0: 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d  "yyy" in the nam
4ec0: 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20  e "xxx.yyy" */. 
4ed0: 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c   Token **pUnqual
4ee0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
4ef0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62  e unqualified ob
4f00: 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a  ject name here *
4f10: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  /.){.  int iDb; 
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f30: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
4f40: 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63  olding the objec
4f50: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
4f60: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
4f70: 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26  ..  if( pName2 &
4f80: 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b  & pName2->n>0 ){
4f90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62  .    assert( !db
4fa0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
4fb0: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
4fc0: 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20  ame2;.    iDb = 
4fd0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62  sqlite3FindDb(db
4fe0: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69  , pName1);.    i
4ff0: 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20  f( iDb<0 ){.    
5000: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5010: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
5020: 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c  wn database %T",
5030: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20   pName1);.      
5040: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
5050: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5060: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
5070: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
5080: 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64  init.iDb==0 || d
5090: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
50a0: 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e      iDb = db->in
50b0: 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e  it.iDb;.    *pUn
50c0: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20  qual = pName1;. 
50d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b   }.  return iDb;
50e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
50f0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
5100: 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55  o check if the U
5110: 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d  TF-8 string zNam
5120: 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20  e is a legal.** 
5130: 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  unqualified name
5140: 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d   for a new schem
5150: 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c  a object (table,
5160: 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a   index, view or.
5170: 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c  ** trigger). All
5180: 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c   names are legal
5190: 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68   except those th
51a0: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  at begin with th
51b0: 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c  e string.** "sql
51c0: 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c  ite_" (in upper,
51d0: 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20   lower or mixed 
51e0: 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74  case). This port
51f0: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73  ion of the names
5200: 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72  pace.** is reser
5210: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
5220: 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   use..*/.int sql
5230: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
5240: 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ame(Parse *pPars
5250: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
5260: 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50  Name){.  if( !pP
5270: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
5280: 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  usy && pParse->n
5290: 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ested==0 .      
52a0: 20 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e      && (pParse->
52b0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
52c0: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d  TE_WriteSchema)=
52d0: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
52e0: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43  0==sqlite3StrNIC
52f0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
5300: 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73  e_", 7) ){.    s
5310: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5320: 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e  Parse, "object n
5330: 61 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72  ame reserved for
5340: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25   internal use: %
5350: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
5360: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
5370: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
5380: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5390: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73  /*.** Begin cons
53a0: 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74  tructing a new t
53b0: 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
53c0: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  ion in memory.  
53d0: 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  This is.** the f
53e0: 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20  irst of several 
53f0: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
5400: 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20  that get called 
5410: 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74  in response.** t
5420: 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  o a CREATE TABLE
5430: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20   statement.  In 
5440: 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73  particular, this
5450: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5460: 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69  ed.** after seei
5470: 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54  ng tokens "CREAT
5480: 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61  E" and "TABLE" a
5490: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  nd the table nam
54a0: 65 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a  e. The isTemp.**
54b0: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
54c0: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
54d0: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
54e0: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
54f0: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e  abase.** file in
5500: 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20  stead of in the 
5510: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
5520: 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  le.  This is nor
5530: 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a  mally the case.*
5540: 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50  * when the "TEMP
5550: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
5560: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
5570: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
5580: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
5590: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
55a0: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
55b0: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
55c0: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
55d0: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
55e0: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
55f0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5600: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
5610: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
5620: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
5630: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
5640: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
5650: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
5660: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
5670: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
5680: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
5690: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
56a0: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  e() routine.** i
56b0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
56c0: 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75  lete the constru
56d0: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  ction of the new
56e0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a   table record..*
56f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  /.void sqlite3St
5700: 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73  artTable(.  Pars
5710: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
5720: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
5730: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
5740: 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61  1,   /* First pa
5750: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
5760: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
5770: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
5780: 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63  pName2,   /* Sec
5790: 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ond part of the 
57a0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
57b0: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69  e or view */.  i
57c0: 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
57d0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
57e0: 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20  is a TEMP table 
57f0: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c  */.  int isView,
5800: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
5810: 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20   this is a VIEW 
5820: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75  */.  int isVirtu
5830: 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66  al,   /* True if
5840: 20 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55   this is a VIRTU
5850: 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  AL table */.  in
5860: 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f  t noErr        /
5870: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
5880: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
5890: 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
58a0: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68  le *pTable;.  ch
58b0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f  ar *zName = 0; /
58c0: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
58d0: 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
58e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
58f0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
5900: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b  e *v;.  int iDb;
5910: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
5920: 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63  base number to c
5930: 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  reate the table 
5940: 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  in */.  Token *p
5950: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75  Name;    /* Unqu
5960: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
5970: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65  the table to cre
5980: 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ate */..  /* The
5990: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
59a0: 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73  ame to create is
59b0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
59c0: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
59d0: 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61  ns.  ** pName1 a
59e0: 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68  nd pName2. If th
59f0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73  e table name was
5a00: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5a10: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20  , for example:. 
5a20: 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20   **.  ** CREATE 
5a30: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
5a40: 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ..);.  ** .  ** 
5a50: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5a60: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
5a70: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
5a80: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
5a90: 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  if.  ** the tabl
5aa0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
5ab0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
5ac0: 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  .e.:.  **.  ** C
5ad0: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
5ae0: 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ...);.  **.  ** 
5af0: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5b00: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
5b10: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20  pName2 is ""..  
5b20: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  **.  ** The call
5b30: 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20   below sets the 
5b40: 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f  pName pointer to
5b50: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
5b60: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20  ken (pName1 or. 
5b70: 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74   ** pName2) that
5b80: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
5b90: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
5ba0: 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65  me. The variable
5bb0: 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74   iDb is.  ** set
5bc0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
5bd0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
5be0: 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  at the table or 
5bf0: 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20  view is to be.  
5c00: 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20  ** created in.. 
5c10: 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   */.  iDb = sqli
5c20: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
5c30: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
5c40: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
5c50: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
5c60: 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49  turn;.  if( !OMI
5c70: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
5c80: 6d 70 20 26 26 20 69 44 62 3e 31 20 29 7b 0a 20  mp && iDb>1 ){. 
5c90: 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e     /* If creatin
5ca0: 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20  g a temp table, 
5cb0: 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74  the name may not
5cc0: 20 62 65 20 71 75 61 6c 69 66 69 65 64 20 2a 2f   be qualified */
5cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5ce0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65  rMsg(pParse, "te
5cf0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61  mporary table na
5d00: 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61  me must be unqua
5d10: 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65  lified");.    re
5d20: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
5d30: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
5d40: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
5d50: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61  ;..  pParse->sNa
5d60: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
5d70: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
5d80: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
5d90: 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (pName);.  if( z
5da0: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
5db0: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
5dc0: 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
5dd0: 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
5de0: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
5df0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
5e00: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  _error;.  }.  if
5e10: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
5e20: 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a  1 ) isTemp = 1;.
5e30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5e40: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
5e50: 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 54  N.  assert( (isT
5e60: 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70  emp & 1)==isTemp
5e70: 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20   );.  {.    int 
5e80: 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  code;.    char *
5e90: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
5ea0: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
5eb0: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
5ec0: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
5ed0: 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
5ee0: 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20  _TABLE(isTemp), 
5ef0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
5f00: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
5f10: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
5f20: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
5f30: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
5f40: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
5f50: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
5f60: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
5f70: 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  E_TEMP_VIEW;.   
5f80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5f90: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
5fa0: 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20  CREATE_VIEW;.   
5fb0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
5fc0: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
5fd0: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
5fe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
5ff0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
6000: 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
6010: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6020: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
6030: 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20  CREATE_TABLE;.  
6040: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6050: 69 66 28 20 21 69 73 56 69 72 74 75 61 6c 20 26  if( !isVirtual &
6060: 26 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  & sqlite3AuthChe
6070: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
6080: 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20   zName, 0, zDb) 
6090: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
60a0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
60b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
60c0: 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
60d0: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  e the new table 
60e0: 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  name does not co
60f0: 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78  llide with an ex
6100: 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  isting.  ** inde
6110: 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20  x or table name 
6120: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
6130: 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20  base.  Issue an 
6140: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66  error message if
6150: 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54  .  ** it does. T
6160: 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  he exception is 
6170: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
6180: 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 77 61   being parsed wa
6190: 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f  s passed.  ** to
61a0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c   an sqlite3_decl
61b0: 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e  are_vtab() call.
61c0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e   In that case on
61d0: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
61e0: 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70  mes.  ** and typ
61f0: 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c  es will be used,
6200: 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   so there is no 
6210: 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72  need to test for
6220: 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20   namespace.  ** 
6230: 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f  collisions..  */
6240: 0a 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c 41  .  if( !IN_DECLA
6250: 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 69  RE_VTAB ){.    i
6260: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
6270: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
6280: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20  pParse) ){.     
6290: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
62a0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
62b0: 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69     pTable = sqli
62c0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
62d0: 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b   zName, db->aDb[
62e0: 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  iDb].zName);.   
62f0: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
6300: 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20       if( !noErr 
6310: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6320: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6330: 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72  e, "table %T alr
6340: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e  eady exists", pN
6350: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
6360: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6370: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
6380: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
6390: 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
63a0: 4e 61 6d 65 2c 20 30 29 21 3d 30 20 26 26 20 28  Name, 0)!=0 && (
63b0: 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69  iDb==0 || !db->i
63c0: 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20  nit.busy) ){.   
63d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
63e0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
63f0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
6400: 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c  index named %s",
6410: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67   zName);.      g
6420: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
6430: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
6440: 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  ..  pTable = sql
6450: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
6460: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
6470: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ( pTable==0 ){. 
6480: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
6490: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
64a0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
64b0: 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  ;.    goto begin
64c0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
64d0: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  }.  pTable->zNam
64e0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  e = zName;.  pTa
64f0: 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  ble->iPKey = -1;
6500: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  .  pTable->pSche
6510: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
6520: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61  ].pSchema;.  pTa
6530: 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ble->nRef = 1;. 
6540: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65   if( pParse->pNe
6550: 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33  wTable ) sqlite3
6560: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
6570: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6580: 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e  e);.  pParse->pN
6590: 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  ewTable = pTable
65a0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
65b0: 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c  is the magic sql
65c0: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
65d0: 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f 69  le used by autoi
65e0: 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74  ncrement,.  ** t
65f0: 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69  hen record a poi
6600: 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61 62  nter to this tab
6610: 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  le in the main d
6620: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
6630: 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49  e.  ** so that I
6640: 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74  NSERT can find t
6650: 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e  he table easily.
6660: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
6670: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
6680: 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70  CREMENT.  if( !p
6690: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26  Parse->nested &&
66a0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22   strcmp(zName, "
66b0: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22  sqlite_sequence"
66c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62  )==0 ){.    pTab
66d0: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  le->pSchema->pSe
66e0: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
66f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
6700: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
6710: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
6720: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
6730: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
6740: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
6750: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
6760: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
6770: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
6780: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
6790: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
67a0: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
67b0: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
67c0: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
67d0: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
67e0: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
67f0: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
6800: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
6810: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
6820: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
6830: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
6840: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
6850: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
6860: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
6870: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
6880: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
6890: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
68a0: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
68b0: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
68c0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
68d0: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
68e0: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
68f0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 62 6c  0 ){.    int lbl
6900: 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f  ;.    int fileFo
6910: 72 6d 61 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rmat;.    sqlite
6920: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
6930: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
6940: 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
6950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
6960: 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
6970: 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  isVirtual ){.   
6980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6990: 64 4f 70 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  dOp(v, OP_VBegin
69a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  , 0, 0);.    }.#
69b0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
69c0: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
69d0: 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e   and encoding in
69e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
69f0: 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c  ve not been set,
6a00: 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65   .    ** set the
6a10: 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  m now..    */.  
6a20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6a30: 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f  Op(v, OP_ReadCoo
6a40: 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 20 20 20  kie, iDb, 1);   
6a50: 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20 2a  /* file_format *
6a60: 2f 0a 20 20 20 20 6c 62 6c 20 3d 20 73 71 6c 69  /.    lbl = sqli
6a70: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
6a80: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
6a90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6aa0: 49 66 2c 20 30 2c 20 6c 62 6c 29 3b 0a 20 20 20  If, 0, lbl);.   
6ab0: 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64   fileFormat = (d
6ac0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
6ad0: 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29  E_LegacyFileFmt)
6ae0: 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20  !=0 ?.          
6af0: 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49          1 : SQLI
6b00: 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d  TE_MAX_FILE_FORM
6b10: 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  AT;.    sqlite3V
6b20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6b30: 6e 74 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d  nteger, fileForm
6b40: 61 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  at, 0);.    sqli
6b50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6b60: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
6b70: 62 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 1);.    sqlit
6b80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6b90: 50 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64  P_Integer, ENC(d
6ba0: 62 29 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  b), 0);.    sqli
6bb0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6bc0: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
6bd0: 62 2c 20 34 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 4);.    sqlit
6be0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
6bf0: 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 0a 20 20 20  el(v, lbl);..   
6c00: 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72   /* This just cr
6c10: 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f  eates a place-ho
6c20: 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74  lder record in t
6c30: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
6c40: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54   table..    ** T
6c50: 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65  he record create
6c60: 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  d does not conta
6c70: 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e  in anything yet.
6c80: 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70    It will be rep
6c90: 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  laced.    ** by 
6ca0: 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69  the real entry i
6cb0: 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  n code generated
6cc0: 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61   at sqlite3EndTa
6cd0: 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ble()..    **.  
6ce0: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
6cf0: 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  or the new entry
6d00: 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20   is left on the 
6d10: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
6d20: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  ..    ** The row
6d30: 69 64 20 76 61 6c 75 65 20 69 73 20 6e 65 65 64  id value is need
6d40: 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74  ed by the code t
6d50: 68 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61  hat sqlite3EndTa
6d60: 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ble will.    ** 
6d70: 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f  generate..    */
6d80: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
6d90: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
6da0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
6db0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
6dc0: 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73  ABLE).    if( is
6dd0: 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61  View || isVirtua
6de0: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
6df0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6e00: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
6e10: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
6e20: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73  if.    {.      s
6e30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6e40: 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  v, OP_CreateTabl
6e50: 65 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  e, iDb, 0);.    
6e60: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  }.    sqlite3Ope
6e70: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61  nMasterTable(pPa
6e80: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  rse, iDb);.    s
6e90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6ea0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
6eb0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
6ec0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6ed0: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
6ee0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6ef0: 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  Op(v, OP_Null, 0
6f00: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6f10: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6f20: 5f 49 6e 73 65 72 74 2c 20 30 2c 20 30 29 3b 0a  _Insert, 0, 0);.
6f30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6f40: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
6f50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6f60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6f70: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
6f80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61  .  }..  /* Norma
6f90: 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65  l (non-error) re
6fa0: 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72  turn. */.  retur
6fb0: 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  n;..  /* If an e
6fc0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20  rror occurs, we 
6fd0: 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67  jump here */.beg
6fe0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a  in_table_error:.
6ff0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
7000: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  me);.  return;.}
7010: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63  ../*.** This mac
7020: 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  ro is used to co
7030: 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67  mpare two string
7040: 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73 65  s in a case-inse
7050: 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a  nsitive manner..
7060: 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74 6c  ** It is slightl
7070: 79 20 66 61 73 74 65 72 20 74 68 61 6e 20 63 61  y faster than ca
7080: 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74 72  lling sqlite3Str
7090: 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79 2c  ICmp() directly,
70a0: 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73   but.** produces
70b0: 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a   larger code..**
70c0: 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 69  .** WARNING: Thi
70d0: 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 63  s macro is not c
70e0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
70f0: 68 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d 69  he strcmp() fami
7100: 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e  ly. It.** return
7110: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 77  s true if the tw
7120: 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20 65 71  o strings are eq
7130: 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20 66  ual, otherwise f
7140: 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  alse..*/.#define
7150: 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20 28   STRICMP(x, y) (
7160: 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  \.sqlite3UpperTo
7170: 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64  Lower[*(unsigned
7180: 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20   char *)(x)]==  
7190: 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54   \.sqlite3UpperT
71a0: 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65  oLower[*(unsigne
71b0: 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20 20  d char *)(y)]   
71c0: 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53 74    \.&& sqlite3St
71d0: 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b  rICmp((x)+1,(y)+
71e0: 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41  1)==0 )../*.** A
71f0: 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20  dd a new column 
7200: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
7210: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
7220: 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  structed..**.** 
7230: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
7240: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
7250: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
7260: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  mn declaration.*
7270: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
7280: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
7290: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
72a0: 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a  e() gets called.
72b0: 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20  ** first to get 
72c0: 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54  things going.  T
72d0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
72e0: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65   is called for e
72f0: 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a  ach.** column..*
7300: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
7310: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
7320: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
7330: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
7340: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
7350: 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  r *z;.  Column *
7360: 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d  pCol;.  if( (p =
7370: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
7380: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
7390: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
73a0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
73b0: 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  e);.  if( z==0 )
73c0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
73d0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
73e0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 54 52  ++){.    if( STR
73f0: 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b  ICMP(z, p->aCol[
7400: 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  i].zName) ){.   
7410: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7420: 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c  sg(pParse, "dupl
7430: 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  icate column nam
7440: 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  e: %s", z);.    
7450: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
7460: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
7470: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
7480: 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d  p->nCol & 0x7)==
7490: 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  0 ){.    Column 
74a0: 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20  *aNew;.    aNew 
74b0: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
74c0: 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43   p->aCol, (p->nC
74d0: 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ol+8)*sizeof(p->
74e0: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aCol[0]));.    i
74f0: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
7500: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
7510: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
7520: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43  .    }.    p->aC
7530: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
7540: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
7550: 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d  [p->nCol];.  mem
7560: 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a  set(pCol, 0, siz
7570: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
7580: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20  ;.  pCol->zName 
7590: 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74  = z;. .  /* If t
75a0: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
75b0: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
75c0: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
75d0: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a  ult affinity.  *
75e0: 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65  * 'NONE'. If the
75f0: 72 65 20 69 73 20 61 20 74 79 70 65 20 73 70 65  re is a type spe
7600: 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c  cified, then sql
7610: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
7620: 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  e() will.  ** be
7630: 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20   called next to 
7640: 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  set pCol->affini
7650: 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ty correctly..  
7660: 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  */.  pCol->affin
7670: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
7680: 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e 43 6f 6c  _NONE;.  p->nCol
7690: 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ++;.}../*.** Thi
76a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
76b0: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
76c0: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
76d0: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
76e0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
76f0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  LE statement.  A
7700: 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73   "NOT NULL" cons
7710: 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65  traint has.** be
7720: 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c  en seen on a col
7730: 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  umn.  This routi
7740: 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e  ne sets the notN
7750: 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74  ull flag on.** t
7760: 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  he column curren
7770: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
7780: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
7790: 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c  sqlite3AddNotNul
77a0: 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  l(Parse *pParse,
77b0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
77c0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
77d0: 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70   i;.  if( (p = p
77e0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
77f0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
7800: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
7810: 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e    if( i>=0 ) p->
7820: 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20  aCol[i].notNull 
7830: 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a  = onError;.}../*
7840: 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c  .** Scan the col
7850: 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54  umn type name zT
7860: 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70  ype (length nTyp
7870: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  e) and return th
7880: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
7890: 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a  affinity type..*
78a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
78b0: 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e  e does a case-in
78c0: 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68  dependent search
78d0: 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68   of zType for th
78e0: 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73  e .** substrings
78f0: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
7900: 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20  g table. If one 
7910: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
7920: 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74  s is.** found, t
7930: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
7940: 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74   affinity is ret
7950: 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20  urned. If zType 
7960: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65  contains.** more
7970: 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65   than one of the
7980: 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74   substrings, ent
7990: 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20  ries toward the 
79a0: 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74  top of .** the t
79b0: 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69  able take priori
79c0: 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ty. For example,
79d0: 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c   if zType is 'BL
79e0: 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49  OBINT', .** SQLI
79f0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69  TE_AFF_INTEGER i
7a00: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
7a10: 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20  * Substring     
7a20: 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d  | Affinity.** --
7a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
7a50: 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20  * 'INT'         
7a60: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  | SQLITE_AFF_INT
7a70: 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20  EGER.** 'CHAR'  
7a80: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7a90: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42  FF_TEXT.** 'CLOB
7aa0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7ab0: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54  E_AFF_TEXT.** 'T
7ac0: 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51  EXT'        | SQ
7ad0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
7ae0: 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'BLOB'        |
7af0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
7b00: 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20  .** 'REAL'      
7b10: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
7b20: 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20  EAL.** 'FLOA'   
7b30: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7b40: 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27  F_REAL.** 'DOUB'
7b50: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7b60: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20  _AFF_REAL.**.** 
7b70: 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  If none of the s
7b80: 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  ubstrings in the
7b90: 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65   above table are
7ba0: 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54   found,.** SQLIT
7bb0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73  E_AFF_NUMERIC is
7bc0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68   returned..*/.ch
7bd0: 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69  ar sqlite3Affini
7be0: 74 79 54 79 70 65 28 63 6f 6e 73 74 20 54 6f 6b  tyType(const Tok
7bf0: 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 75 33  en *pType){.  u3
7c00: 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  2 h = 0;.  char 
7c10: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7c20: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73  _NUMERIC;.  cons
7c30: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
7c40: 2a 7a 49 6e 20 3d 20 70 54 79 70 65 2d 3e 7a 3b  *zIn = pType->z;
7c50: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
7c60: 64 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26  d char *zEnd = &
7c70: 70 54 79 70 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e  pType->z[pType->
7c80: 6e 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49  n];..  while( zI
7c90: 6e 21 3d 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68  n!=zEnd ){.    h
7ca0: 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69   = (h<<8) + sqli
7cb0: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
7cc0: 2a 7a 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b  *zIn];.    zIn++
7cd0: 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27  ;.    if( h==(('
7ce0: 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36  c'<<24)+('h'<<16
7cf0: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20  )+('a'<<8)+'r') 
7d00: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){             /
7d10: 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20  * CHAR */.      
7d20: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7d30: 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73  _TEXT; .    }els
7d40: 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c  e if( h==(('c'<<
7d50: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
7d60: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20  o'<<8)+'b') ){  
7d70: 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a       /* CLOB */.
7d80: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
7d90: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
7da0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
7db0: 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  't'<<24)+('e'<<1
7dc0: 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29  6)+('x'<<8)+'t')
7dd0: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58   ){       /* TEX
7de0: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
7df0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
7e00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7e10: 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27  h==(('b'<<24)+('
7e20: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
7e30: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
7e40: 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * BLOB */.      
7e50: 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
7e60: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c  E_AFF_NUMERIC ||
7e70: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
7e80: 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  _REAL) ){.      
7e90: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7ea0: 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53  _NONE;.#ifndef S
7eb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
7ec0: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65  ING_POINT.    }e
7ed0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27  lse if( h==(('r'
7ee0: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
7ef0: 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20  ('a'<<8)+'l')   
7f00: 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a         /* REAL *
7f10: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
7f20: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
7f30: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
7f40: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
7f50: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
7f60: 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29  f( h==(('f'<<24)
7f70: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
7f80: 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20  <8)+'a')        
7f90: 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20    /* FLOA */.   
7fa0: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
7fb0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
7fc0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
7fd0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
7fe0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
7ff0: 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27  =(('d'<<24)+('o'
8000: 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27  <<16)+('u'<<8)+'
8010: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
8020: 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  DOUB */.        
8030: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
8040: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
8050: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
8060: 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69  _AFF_REAL;.#endi
8070: 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  f.    }else if( 
8080: 28 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d  (h&0x00FFFFFF)==
8090: 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c  (('i'<<16)+('n'<
80a0: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f  <8)+'t') ){    /
80b0: 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61  * INT */.      a
80c0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
80d0: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62  INTEGER;.      b
80e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
80f0: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
8100: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8110: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
8120: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
8130: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
8140: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
8150: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
8160: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46  atement.  The pF
8170: 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68  irst token is th
8180: 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e  e first.** token
8190: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
81a0: 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20   of tokens that 
81b0: 64 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70  describe the typ
81c0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75  e of the.** colu
81d0: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
81e0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
81f0: 20 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20     pLast is the 
8200: 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e  last token.** in
8210: 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20   the sequence.  
8220: 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61  Use this informa
8230: 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63  tion to construc
8240: 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68  t a string.** th
8250: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
8260: 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20  typename of the 
8270: 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65  column and store
8280: 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20   that string.** 
8290: 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f  in zType..*/ .vo
82a0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
82b0: 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70  umnType(Parse *p
82c0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
82d0: 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ype){.  Table *p
82e0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c  ;.  int i;.  Col
82f0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69 66  umn *pCol;..  if
8300: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
8310: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
8320: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
8330: 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c  nCol-1;.  if( i<
8340: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43  0 ) return;.  pC
8350: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d  ol = &p->aCol[i]
8360: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
8370: 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 70  Col->zType);.  p
8380: 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c  Col->zType = sql
8390: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
83a0: 6e 28 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c  n(pType);.  pCol
83b0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
83c0: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
83d0: 28 70 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pType);.}../*.*
83e0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
83f0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
8400: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f  value for the mo
8410: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
8420: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74  d column.** of t
8430: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
8440: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
8450: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66  ction..**.** Def
8460: 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65  ault value expre
8470: 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63  ssions must be c
8480: 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20  onstant.  Raise 
8490: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20  an exception if 
84a0: 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74  this.** is not t
84b0: 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  he case..**.** T
84c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
84d0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
84e0: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
84f0: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
8500: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
8510: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
8520: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
8530: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50  ddDefaultValue(P
8540: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
8550: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 61  pr *pExpr){.  Ta
8560: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
8570: 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70   *pCol;.  if( (p
8580: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
8590: 61 62 6c 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  able)!=0 ){.    
85a0: 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c  pCol = &(p->aCol
85b0: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20  [p->nCol-1]);.  
85c0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
85d0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
85e0: 6e 63 74 69 6f 6e 28 70 45 78 70 72 29 20 29 7b  nction(pExpr) ){
85f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8600: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8610: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66  default value of
8620: 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20   column [%s] is 
8630: 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20  not constant",. 
8640: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a           pCol->z
8650: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
8660: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
8670: 6f 70 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  opy;.      sqlit
8680: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f  e3ExprDelete(pCo
8690: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
86a0: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 70   pCol->pDflt = p
86b0: 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78  Copy = sqlite3Ex
86c0: 70 72 44 75 70 28 70 45 78 70 72 29 3b 0a 20 20  prDup(pExpr);.  
86d0: 20 20 20 20 69 66 28 20 70 43 6f 70 79 20 29 7b      if( pCopy ){
86e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
86f0: 54 6f 6b 65 6e 43 6f 70 79 28 26 70 43 6f 70 79  TokenCopy(&pCopy
8700: 2d 3e 73 70 61 6e 2c 20 26 70 45 78 70 72 2d 3e  ->span, &pExpr->
8710: 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  span);.      }. 
8720: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
8730: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
8740: 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  pr);.}../*.** De
8750: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
8760: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
8770: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
8780: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
8790: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
87a0: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
87b0: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
87c0: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
87d0: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
87e0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
87f0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
8800: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
8810: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
8820: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
8830: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
8840: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
8850: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
8860: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
8870: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
8880: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
8890: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
88a0: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
88b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
88c0: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
88d0: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
88e0: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
88f0: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
8900: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
8910: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
8920: 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53  as the rowid.  S
8930: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
8940: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
8950: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
8960: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
8970: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
8980: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
8990: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
89a0: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
89b0: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
89c0: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
89d0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
89e0: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
89f0: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
8a00: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8a10: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
8a20: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
8a30: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
8a40: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
8a50: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
8a60: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
8a70: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50  void sqlite3AddP
8a80: 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72  rimaryKey(.  Par
8a90: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
8aa0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
8ab0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
8ac0: 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  *pList,  /* List
8ad0: 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20   of field names 
8ae0: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
8af0: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
8b00: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
8b10: 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65  do with a unique
8b20: 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  ness conflict */
8b30: 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20  .  int autoInc, 
8b40: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
8b50: 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  the AUTOINCREMEN
8b60: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
8b70: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  sent */.  int so
8b80: 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53  rtOrder     /* S
8b90: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20  QLITE_SO_ASC or 
8ba0: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a  SQLITE_SO_DESC *
8bb0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
8bc0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
8bd0: 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  wTable;.  char *
8be0: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
8bf0: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
8c00: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20   if( pTab==0 || 
8c10: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
8c20: 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b  ) goto primary_k
8c30: 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70  ey_exit;.  if( p
8c40: 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20  Tab->hasPrimKey 
8c50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8c60: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
8c70: 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25        "table \"%
8c80: 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  s\" has more tha
8c90: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
8ca0: 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  y", pTab->zName)
8cb0: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61  ;.    goto prima
8cc0: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d  ry_key_exit;.  }
8cd0: 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d  .  pTab->hasPrim
8ce0: 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  Key = 1;.  if( p
8cf0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  List==0 ){.    i
8d00: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col = pTab->nCol
8d10: 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   - 1;.    pTab->
8d20: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69  aCol[iCol].isPri
8d30: 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  mKey = 1;.  }els
8d40: 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
8d50: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
8d60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  i++){.      for(
8d70: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
8d80: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
8d90: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
8da0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
8db0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
8dc0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
8dd0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
8de0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8df0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8e00: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
8e10: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
8e20: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
8e30: 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79  [iCol].isPrimKey
8e40: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
8e50: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73    }.    if( pLis
8e60: 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f  t->nExpr>1 ) iCo
8e70: 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66  l = -1;.  }.  if
8e80: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
8e90: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  l<pTab->nCol ){.
8ea0: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
8eb0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
8ec0: 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54  pe;.  }.  if( zT
8ed0: 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ype && sqlite3St
8ee0: 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e  rICmp(zType, "IN
8ef0: 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20  TEGER")==0.     
8f00: 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72 3d     && sortOrder=
8f10: 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29  =SQLITE_SO_ASC )
8f20: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  {.    pTab->iPKe
8f30: 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54  y = iCol;.    pT
8f40: 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e  ab->keyConf = on
8f50: 45 72 72 6f 72 3b 0a 20 20 20 20 70 54 61 62 2d  Error;.    pTab-
8f60: 3e 61 75 74 6f 49 6e 63 20 3d 20 61 75 74 6f 49  >autoInc = autoI
8f70: 6e 63 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  nc;.  }else if( 
8f80: 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64  autoInc ){.#ifnd
8f90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
8fa0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
8fb0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8fc0: 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e  (pParse, "AUTOIN
8fd0: 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20  CREMENT is only 
8fe0: 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a  allowed on an ".
8ff0: 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20         "INTEGER 
9000: 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23  PRIMARY KEY");.#
9010: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
9020: 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65     sqlite3Create
9030: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c  Index(pParse, 0,
9040: 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e   0, 0, pList, on
9050: 45 72 72 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72  Error, 0, 0, sor
9060: 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20 20 20  tOrder, 0);.    
9070: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pList = 0;.  }..
9080: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
9090: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
90a0: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
90b0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
90c0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43  *.** Add a new C
90d0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
90e0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
90f0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
9100: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
9110: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65  id sqlite3AddChe
9120: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ckConstraint(.  
9130: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
9140: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
9150: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
9160: 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54  pCheckExpr  /* T
9170: 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  he check express
9180: 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ion */.){.#ifnde
9190: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
91a0: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
91b0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
91c0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61  Table;.  if( pTa
91d0: 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45  b && !IN_DECLARE
91e0: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 2f 2a 20  _VTAB ){.    /* 
91f0: 54 68 65 20 43 48 45 43 4b 20 65 78 70 72 65 73  The CHECK expres
9200: 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 64 75 70  sion must be dup
9210: 6c 69 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  licated so that 
9220: 74 6f 6b 65 6e 73 20 72 65 66 65 72 0a 20 20 20  tokens refer.   
9230: 20 2a 2a 20 74 6f 20 6d 61 6c 6c 6f 63 65 64 20   ** to malloced 
9240: 73 70 61 63 65 20 61 6e 64 20 6e 6f 74 20 74 68  space and not th
9250: 65 20 28 65 70 68 65 6d 65 72 61 6c 29 20 74 65  e (ephemeral) te
9260: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
9270: 20 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 73 74   TABLE.    ** st
9280: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 70  atement */.    p
9290: 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71  Tab->pCheck = sq
92a0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 54 61  lite3ExprAnd(pTa
92b0: 62 2d 3e 70 43 68 65 63 6b 2c 20 73 71 6c 69 74  b->pCheck, sqlit
92c0: 65 33 45 78 70 72 44 75 70 28 70 43 68 65 63 6b  e3ExprDup(pCheck
92d0: 45 78 70 72 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  Expr));.  }.#end
92e0: 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  if.  sqlite3Expr
92f0: 44 65 6c 65 74 65 28 70 43 68 65 63 6b 45 78 70  Delete(pCheckExp
9300: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  r);.}../*.** Set
9310: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
9320: 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  unction of the m
9330: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72  ost recently par
9340: 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  sed table column
9350: 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53  .** to the CollS
9360: 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69  eq given..*/.voi
9370: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c  d sqlite3AddColl
9380: 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70  ateType(Parse *p
9390: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
93a0: 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54  r *zType, int nT
93b0: 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ype){.  Table *p
93c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  ;.  int i;..  if
93d0: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
93e0: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
93f0: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
9400: 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 69 66 28 20 73  nCol-1;..  if( s
9410: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
9420: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 54 79 70  Seq(pParse, zTyp
9430: 65 2c 20 6e 54 79 70 65 29 20 29 7b 0a 20 20 20  e, nType) ){.   
9440: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
9450: 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f    p->aCol[i].zCo
9460: 6c 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  ll = sqliteStrND
9470: 75 70 28 7a 54 79 70 65 2c 20 6e 54 79 70 65 29  up(zType, nType)
9480: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
9490: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
94a0: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
94b0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
94c0: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
94d0: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
94e0: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
94f0: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
9500: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
9510: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  he.    ** collat
9520: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
9530: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
9540: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
9550: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  se..    */.    f
9560: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
9570: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
9580: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
9590: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
95a0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
95b0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
95c0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a  Column[0]==i ){.
95d0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
95e0: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f  Coll[0] = p->aCo
95f0: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[i].zColl;.    
9600: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
9610: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
9620: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
9630: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9640: 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65  nce for database
9650: 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20   native text.** 
9660: 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66  encoding identif
9670: 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e  ied by the strin
9680: 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  g zName, length 
9690: 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nName..**.** If 
96a0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
96b0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
96c0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
96d0: 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61  e, or not availa
96e0: 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  ble.** in the da
96f0: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e  tabase native en
9700: 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c  coding, the coll
9710: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73  ation factory is
9720: 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72   invoked to.** r
9730: 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68  equest it. If th
9740: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
9750: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ory does not sup
9760: 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65  ply such a seque
9770: 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  nce,.** and the 
9780: 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69  sequence is avai
9790: 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  lable in another
97a0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20   text encoding, 
97b0: 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20  then that is.** 
97c0: 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
97d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65  ..**.** If no ve
97e0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65  rsions of the re
97f0: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
9800: 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20  ns sequence are 
9810: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a  available, or.**
9820: 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f   another error o
9830: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
9840: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
9850: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69  rror message wri
9860: 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61  tten into.** pPa
9870: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  rse..**.** This 
9880: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72 61  routine is a wra
9890: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
98a0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29  te3FindCollSeq()
98b0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
98c0: 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63  ** invokes the c
98d0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
98e0: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f   if the named co
98f0: 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  llation cannot b
9900: 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67  e found.** and g
9910: 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f  enerates an erro
9920: 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 43 6f  r message..*/.Co
9930: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f  llSeq *sqlite3Lo
9940: 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73  cateCollSeq(Pars
9950: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
9960: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
9970: 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69  t nName){.  sqli
9980: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9990: 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d  ->db;.  u8 enc =
99a0: 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69   ENC(db);.  u8 i
99b0: 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e  nitbusy = db->in
99c0: 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53  it.busy;.  CollS
99d0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43  eq *pColl;..  pC
99e0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
99f0: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63  dCollSeq(db, enc
9a00: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
9a10: 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28  initbusy);.  if(
9a20: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
9a30: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
9a40: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43  >xCmp) ){.    pC
9a50: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
9a60: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f 6c  CollSeq(db, pCol
9a70: 6c 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  l, zName, nName)
9a80: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
9a90: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e   ){.      if( nN
9aa0: 61 6d 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ame<0 ){.       
9ab0: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
9ac0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
9ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9ae0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
9af0: 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e  o such collation
9b00: 20 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22   sequence: %.*s"
9b10: 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  , nName, zName);
9b20: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30  .      pColl = 0
9b30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
9b40: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
9b50: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
9b60: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
9b70: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68  ncrement the sch
9b80: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a  ema cookie..**.*
9b90: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
9ba0: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
9bb0: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
9bc0: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
9bd0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
9be0: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
9bf0: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
9c00: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
9c10: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
9c20: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
9c30: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
9c40: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
9c50: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
9c60: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
9c70: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
9c80: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
9c90: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
9ca0: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
9cb0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
9cc0: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
9cd0: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
9ce0: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
9cf0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
9d00: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
9d10: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
9d20: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
9d30: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
9d40: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
9d50: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
9d60: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
9d70: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
9d80: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
9d90: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
9da0: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
9db0: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
9dc0: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
9dd0: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
9de0: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
9df0: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
9e00: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
9e10: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
9e20: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68  /.void sqlite3Ch
9e30: 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74  angeCookie(sqlit
9e40: 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c  e3 *db, Vdbe *v,
9e50: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
9e60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9e70: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
9e80: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
9e90: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
9ea0: 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  +1, 0);.  sqlite
9eb0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9ec0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
9ed0: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65   0);.}../*.** Me
9ee0: 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72  asure the number
9ef0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e   of characters n
9f00: 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20  eeded to output 
9f10: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65  the given.** ide
9f20: 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75  ntifier.  The nu
9f30: 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e  mber returned in
9f40: 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65  cludes any quote
9f50: 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f  s used.** but do
9f60: 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  es not include t
9f70: 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74  he null terminat
9f80: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73  or..**.** The es
9f90: 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72  timate is conser
9fa0: 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68  vative.  It migh
9fb0: 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74  t be larger that
9fc0: 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c   what is.** real
9fd0: 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ly needed..*/.st
9fe0: 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65  atic int identLe
9ff0: 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  ngth(const char 
a000: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *z){.  int n;.  
a010: 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b  for(n=0; *z; n++
a020: 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , z++){.    if( 
a030: 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20  *z=='"' ){ n++; 
a040: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
a050: 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   + 2;.}../*.** W
a060: 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69  rite an identifi
a070: 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  er onto the end 
a080: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  of the given str
a090: 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f  ing.  Add.** quo
a0a0: 74 65 20 63 68 61 72 61 63 74 65 72 73 20 61 73  te characters as
a0b0: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
a0c0: 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74  ic void identPut
a0d0: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70  (char *z, int *p
a0e0: 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e  Idx, char *zSign
a0f0: 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69  edIdent){.  unsi
a100: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e  gned char *zIden
a110: 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  t = (unsigned ch
a120: 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar*)zSignedIdent
a130: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65  ;.  int i, j, ne
a140: 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a  edQuote;.  i = *
a150: 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  pIdx;.  for(j=0;
a160: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
a170: 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e  {.    if( !isaln
a180: 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26  um(zIdent[j]) &&
a190: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20   zIdent[j]!='_' 
a1a0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e  ) break;.  }.  n
a1b0: 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65  eedQuote =  zIde
a1c0: 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69  nt[j]!=0 || isdi
a1d0: 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20  git(zIdent[0]). 
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1f0: 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f   || sqlite3Keywo
a200: 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a  rdCode(zIdent, j
a210: 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20  )!=TK_ID;.  if( 
a220: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
a230: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28  +] = '"';.  for(
a240: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
a250: 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d  j++){.    z[i++]
a260: 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20   = zIdent[j];.  
a270: 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d    if( zIdent[j]=
a280: 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  ='"' ) z[i++] = 
a290: 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  '"';.  }.  if( n
a2a0: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
a2b0: 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20  ] = '"';.  z[i] 
a2c0: 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69  = 0;.  *pIdx = i
a2d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
a2e0: 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42  ate a CREATE TAB
a2f0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70  LE statement app
a300: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
a310: 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e   given.** table.
a320: 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64    Memory to hold
a330: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
a340: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62   statement is ob
a350: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
a360: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
a370: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
a380: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
a390: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
a3a0: 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54  ic char *createT
a3b0: 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a  ableStmt(Table *
a3c0: 70 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a  p, int isTemp){.
a3d0: 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20    int i, k, n;. 
a3e0: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
a3f0: 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65  char *zSep, *zSe
a400: 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20  p2, *zEnd, *z;. 
a410: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
a420: 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   n = 0;.  for(pC
a430: 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d  ol = p->aCol, i=
a440: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
a450: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
a460: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
a470: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
a480: 20 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79     z = pCol->zTy
a490: 70 65 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b  pe;.    if( z ){
a4a0: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72  .      n += (str
a4b0: 6c 65 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20  len(z) + 1);.   
a4c0: 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64   }.  }.  n += id
a4d0: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
a4e0: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20  me);.  if( n<50 
a4f0: 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  ){.    zSep = ""
a500: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
a510: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
a520: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
a530: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
a540: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
a550: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
a560: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
a570: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
a580: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
a590: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b  eMallocRaw( n );
a5a0: 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20  .  if( zStmt==0 
a5b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74  ) return 0;.  st
a5c0: 72 63 70 79 28 7a 53 74 6d 74 2c 20 21 4f 4d 49  rcpy(zStmt, !OMI
a5d0: 54 5f 54 45 4d 50 44 42 26 26 69 73 54 65 6d 70  T_TEMPDB&&isTemp
a5e0: 20 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20   ? "CREATE TEMP 
a5f0: 54 41 42 4c 45 20 22 3a 22 43 52 45 41 54 45 20  TABLE ":"CREATE 
a600: 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20  TABLE ");.  k = 
a610: 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20  strlen(zStmt);. 
a620: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
a630: 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a   &k, p->zName);.
a640: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
a650: 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70  (';.  for(pCol=p
a660: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
a670: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
a680: 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79  l++){.    strcpy
a690: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70  (&zStmt[k], zSep
a6a0: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c  );.    k += strl
a6b0: 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20  en(&zStmt[k]);. 
a6c0: 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b     zSep = zSep2;
a6d0: 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53  .    identPut(zS
a6e0: 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a  tmt, &k, pCol->z
a6f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 28  Name);.    if( (
a700: 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29  z = pCol->zType)
a710: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 74  !=0 ){.      zSt
a720: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20  mt[k++] = ' ';. 
a730: 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74       strcpy(&zSt
a740: 6d 74 5b 6b 5d 2c 20 7a 29 3b 0a 20 20 20 20 20  mt[k], z);.     
a750: 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b   k += strlen(z);
a760: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72  .    }.  }.  str
a770: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
a780: 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  End);.  return z
a790: 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Stmt;.}../*.** T
a7a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
a7b0: 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20  alled to report 
a7c0: 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68  the final ")" th
a7d0: 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a  at terminates.**
a7e0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
a7f0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
a800: 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63   The table struc
a810: 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20  ture that other 
a820: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
a830: 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69  have been buildi
a840: 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ng.** is added t
a850: 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68  o the internal h
a860: 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75  ash tables, assu
a870: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68  ming no errors h
a880: 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e  ave.** occurred.
a890: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20  .**.** An entry 
a8a0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73  for the table is
a8b0: 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73   made in the mas
a8c0: 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73  ter table on dis
a8d0: 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69  k, unless.** thi
a8e0: 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
a8f0: 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e   table or db->in
a900: 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65  it.busy==1.  Whe
a910: 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  n db->init.busy=
a920: 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77  =1.** it means w
a930: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
a940: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
a950: 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65  table because we
a960: 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74   just.** connect
a970: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
a980: 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  se or because th
a990: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
a9a0: 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63  table has.** rec
a9b0: 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73  ently changed, s
a9c0: 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  o the entry for 
a9d0: 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61  this table alrea
a9e0: 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20  dy exists in.** 
a9f0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
aa00: 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20  r table.  We do 
aa10: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61  not want to crea
aa20: 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a  te it again..**.
aa30: 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63  ** If the pSelec
aa40: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  t argument is no
aa50: 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73  t NULL, it means
aa60: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
aa70: 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64  ne.** was called
aa80: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62   to create a tab
aa90: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  le generated fro
aaa0: 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20  m a .** "CREATE 
aab0: 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c  TABLE ... AS SEL
aac0: 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65  ECT ..." stateme
aad0: 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20  nt.  The column 
aae0: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
aaf0: 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d  new table will m
ab00: 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  atch the result 
ab10: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
ab20: 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
ab30: 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61  e3EndTable(.  Pa
ab40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ab50: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
ab60: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
ab70: 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20  n *pCons,       
ab80: 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74      /* The ',' t
ab90: 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c  oken after the l
aba0: 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e  ast column defn.
abb0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e   */.  Token *pEn
abc0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
abd0: 20 54 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74   The final ')' t
abe0: 6f 6b 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41  oken in the CREA
abf0: 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65  TE TABLE */.  Se
ac00: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
ac10: 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20        /* Select 
ac20: 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e  from a "CREATE .
ac30: 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f  .. AS SELECT" */
ac40: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
ac50: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ac60: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
ac70: 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 28 70  t iDb;..  if( (p
ac80: 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63  End==0 && pSelec
ac90: 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d  t==0) || pParse-
aca0: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
acb0: 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
acc0: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   {.    return;. 
acd0: 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d   }.  p = pParse-
ace0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
acf0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
ad00: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ..  assert( !db-
ad10: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70  >init.busy || !p
ad20: 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69 44 62  Select );..  iDb
ad30: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
ad40: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
ad50: 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
ad60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
ad70: 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ECK.  /* Resolve
ad80: 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48   names in all CH
ad90: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  ECK constraint e
ada0: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
adb0: 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b  .  if( p->pCheck
adc0: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
add0: 73 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  sSrc;           
ade0: 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20          /* Fake 
adf0: 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50 61 72  SrcList for pPar
ae00: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f  se->pNewTable */
ae10: 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
ae20: 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20   sNC;           
ae30: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e       /* Name con
ae40: 74 65 78 74 20 66 6f 72 20 70 50 61 72 73 65 2d  text for pParse-
ae50: 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a 20  >pNewTable */.. 
ae60: 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
ae70: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
ae80: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 53 72  .    memset(&sSr
ae90: 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 72  c, 0, sizeof(sSr
aea0: 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e 6e 53  c));.    sSrc.nS
aeb0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53 72 63  rc = 1;.    sSrc
aec0: 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d  .a[0].zName = p-
aed0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53 72 63  >zName;.    sSrc
aee0: 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 3b 0a  .a[0].pTab = p;.
aef0: 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43      sSrc.a[0].iC
af00: 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 20 20  ursor = -1;.    
af10: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
af20: 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
af30: 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20  cList = &sSrc;. 
af40: 20 20 20 73 4e 43 2e 69 73 43 68 65 63 6b 20 3d     sNC.isCheck =
af50: 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   1;.    if( sqli
af60: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
af70: 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 43 68  mes(&sNC, p->pCh
af80: 65 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 65  eck) ){.      re
af90: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
afa0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
afb0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
afc0: 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49  HECK) */..  /* I
afd0: 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
afe0: 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
aff0: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
b000: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
b010: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
b020: 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
b030: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
b040: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
b050: 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
b060: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
b070: 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
b080: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
b090: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
b0a0: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
b0b0: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
b0c0: 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
b0d0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
b0e0: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
b0f0: 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
b100: 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
b110: 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a   routine.).  */.
b120: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
b130: 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e  usy ){.    p->tn
b140: 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
b150: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
b160: 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   If not initiali
b170: 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74  zing, then creat
b180: 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74  e a record for t
b190: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a  he new table.  *
b1a0: 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  * in the SQLITE_
b1b0: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20  MASTER table of 
b1c0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
b1d0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
b1e0: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65  .  ** for the ne
b1f0: 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68  w table entry sh
b200: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
b210: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  on the stack..  
b220: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
b230: 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74  is a TEMPORARY t
b240: 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20  able, write the 
b250: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61  entry into the a
b260: 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69  uxiliary.  ** fi
b270: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
b280: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
b290: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
b2a0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
b2b0: 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  busy ){.    int 
b2c0: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
b2d0: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
b2e0: 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72      /* "view" or
b2f0: 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20   "table" */.    
b300: 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20  char *zType2;   
b310: 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41  /* "VIEW" or "TA
b320: 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  BLE" */.    char
b330: 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54   *zStmt;    /* T
b340: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
b350: 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54  E TABLE or CREAT
b360: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
b370: 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c   */..    v = sql
b380: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
b390: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
b3a0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  0 ) return;..   
b3b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b3c0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
b3d0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  , 0);..    /* Cr
b3e0: 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67  eate the rootpag
b3f0: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  e for the new ta
b400: 62 6c 65 20 61 6e 64 20 70 75 73 68 20 69 74 20  ble and push it 
b410: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
b420: 20 20 20 20 2a 2a 20 41 20 76 69 65 77 20 68 61      ** A view ha
b430: 73 20 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73  s no rootpage, s
b440: 6f 20 6a 75 73 74 20 70 75 73 68 20 61 20 7a 65  o just push a ze
b450: 72 6f 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  ro onto the stac
b460: 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65  k for.    ** vie
b470: 77 73 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  ws.  Initialize 
b480: 7a 54 79 70 65 20 61 74 20 74 68 65 20 73 61 6d  zType at the sam
b490: 65 20 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  e time..    */. 
b4a0: 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63     if( p->pSelec
b4b0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
b4c0: 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65   A regular table
b4d0: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
b4e0: 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20  = "table";.     
b4f0: 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45   zType2 = "TABLE
b500: 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ";.#ifndef SQLIT
b510: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20  E_OMIT_VIEW.    
b520: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
b530: 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  A view */.      
b540: 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a  zType = "view";.
b550: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
b560: 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20  VIEW";.#endif.  
b570: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
b580: 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20  his is a CREATE 
b590: 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45  TABLE xx AS SELE
b5a0: 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20  CT ..., execute 
b5b0: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a  the SELECT.    *
b5c0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70  * statement to p
b5d0: 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20  opulate the new 
b5e0: 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d  table. The root-
b5f0: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
b600: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74  the.    ** new t
b610: 61 62 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74  able is on the t
b620: 6f 70 20 6f 66 20 74 68 65 20 76 64 62 65 20 73  op of the vdbe s
b630: 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tack..    **.   
b640: 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c   ** Once the SEL
b650: 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64  ECT has been cod
b660: 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c  ed by sqlite3Sel
b670: 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20  ect(), it is in 
b680: 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c  a.    ** suitabl
b690: 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79  e state to query
b6a0: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
b6b0: 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20  names and types 
b6c0: 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a  to be used.    *
b6d0: 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62  * by the new tab
b6e0: 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
b6f0: 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65  * A shared-cache
b700: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e   write-lock is n
b710: 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77  ot required to w
b720: 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20  rite to the new 
b730: 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73  table,.    ** as
b740: 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d   a schema-lock m
b750: 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
b760: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74   been obtained t
b770: 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e  o create it. Sin
b780: 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65  ce.    ** a sche
b790: 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73  ma-lock excludes
b7a0: 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62   all other datab
b7b0: 61 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77  ase users, the w
b7c0: 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a  rite-lock would.
b7d0: 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64      ** be redund
b7e0: 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ant..    */.    
b7f0: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
b800: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c       Table *pSel
b810: 54 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Tab;.      sqlit
b820: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b830: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
b840: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b850: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
b860: 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20  er, iDb, 0);.   
b870: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b880: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
b890: 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ite, 1, 0);.    
b8a0: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
b8b0: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
b8c0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
b8d0: 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61 62  pSelect, SRT_Tab
b8e0: 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20  le, 1, 0, 0, 0, 
b8f0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
b900: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b910: 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20  _Close, 1, 0);. 
b920: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
b930: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
b940: 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
b950: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
b960: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30  Select(pParse, 0
b970: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
b980: 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d      if( pSelTab=
b990: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
b9a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
b9b0: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
b9c0: 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65     p->nCol = pSe
b9d0: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
b9e0: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53      p->aCol = pS
b9f0: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
ba00: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
ba10: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
ba20: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
ba30: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
ba40: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
ba50: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
ba60: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
ba70: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
ba80: 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
ba90: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
baa0: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  nt */.    if( pS
bab0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
bac0: 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62  Stmt = createTab
bad0: 6c 65 53 74 6d 74 28 70 2c 20 70 2d 3e 70 53 63  leStmt(p, p->pSc
bae0: 68 65 6d 61 3d 3d 70 50 61 72 73 65 2d 3e 64 62  hema==pParse->db
baf0: 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
bb00: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
bb10: 20 20 20 20 6e 20 3d 20 70 45 6e 64 2d 3e 7a 20      n = pEnd->z 
bb20: 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  - pParse->sNameT
bb30: 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20 20  oken.z + 1;.    
bb40: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
bb50: 33 4d 50 72 69 6e 74 66 28 22 43 52 45 41 54 45  3MPrintf("CREATE
bb60: 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65   %s %.*s", zType
bb70: 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e  2, n, pParse->sN
bb80: 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20  ameToken.z);.   
bb90: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f   }..    /* A slo
bba0: 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  t for the record
bbb0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
bbc0: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74  n allocated in t
bbd0: 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  he .    ** SQLIT
bbe0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
bbf0: 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f   We just need to
bc00: 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f   update that slo
bc10: 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a  t with all.    *
bc20: 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  * the informatio
bc30: 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65  n we've collecte
bc40: 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 66 6f  d.  The rowid fo
bc50: 72 20 74 68 65 20 70 72 65 61 6c 6c 6f 63 61 74  r the preallocat
bc60: 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69  ed.    ** slot i
bc70: 73 20 74 68 65 20 32 6e 64 20 69 74 65 6d 20 6f  s the 2nd item o
bc80: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68  n the stack.  Th
bc90: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
bca0: 63 6b 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ck is the.    **
bcb0: 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 74   root page for t
bcc0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 6f 72  he new table (or
bcd0: 20 61 20 30 20 69 66 20 74 68 69 73 20 69 73 20   a 0 if this is 
bce0: 61 20 76 69 65 77 29 2e 0a 20 20 20 20 2a 2f 0a  a view)..    */.
bcf0: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
bd00: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
bd10: 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
bd20: 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53  %s ".         "S
bd30: 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61  ET type='%s', na
bd40: 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d  me=%Q, tbl_name=
bd50: 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 30 2c  %Q, rootpage=#0,
bd60: 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20   sql=%Q ".      
bd70: 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 31   "WHERE rowid=#1
bd80: 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ",.      db->aDb
bd90: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
bda0: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
bdb0: 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20        zType,.   
bdc0: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
bdd0: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
bde0: 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a     zStmt.    );.
bdf0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
be00: 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
be10: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
be20: 62 2c 20 76 2c 20 69 44 62 29 3b 0a 0a 23 69 66  b, v, iDb);..#if
be30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
be40: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
be50: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
be60: 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ee if we need to
be70: 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74   create an sqlit
be80: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
be90: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70   for.    ** keep
bea0: 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74  ing track of aut
beb0: 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e  oincrement keys.
bec0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
bed0: 70 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20  p->autoInc ){.  
bee0: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
bef0: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
bf00: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68     if( pDb->pSch
bf10: 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20  ema->pSeqTab==0 
bf20: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
bf30: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
bf40: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
bf50: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51  "CREATE TABLE %Q
bf60: 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
bf70: 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20  (name,seq)",.   
bf80: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
bf90: 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  e.        );.   
bfa0: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
bfb0: 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73  f..    /* Repars
bfc0: 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20  e everything to 
bfd0: 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72  update our inter
bfe0: 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  nal data structu
bff0: 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  res */.    sqlit
c000: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
c010: 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62  ParseSchema, iDb
c020: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c  , 0,.        sql
c030: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 74 62 6c  ite3MPrintf("tbl
c040: 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a  _name='%q'",p->z
c050: 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49  Name), P3_DYNAMI
c060: 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  C);.  }...  /* A
c070: 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  dd the table to 
c080: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
c090: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
c0a0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
c0b0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
c0c0: 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65  t.busy && pParse
c0d0: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
c0e0: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
c0f0: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 0a    FKey *pFKey; .
c100: 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68      Schema *pSch
c110: 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61  ema = p->pSchema
c120: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
c130: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
c140: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
c150: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  , p->zName, strl
c160: 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 70  en(p->zName)+1,p
c170: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20  );.    if( pOld 
c180: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
c190: 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20   p==pOld );  /* 
c1a0: 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
c1b0: 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48   failed inside H
c1c0: 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20  ashInsert() */. 
c1d0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
c1e0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
c1f0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
c200: 45 59 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79  EY.    for(pFKey
c210: 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  =p->pFKey; pFKey
c220: 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70  ; pFKey=pFKey->p
c230: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20  NextFrom){.     
c240: 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65   int nTo = strle
c250: 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20  n(pFKey->zTo) + 
c260: 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  1;.      pFKey->
c270: 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65  pNextTo = sqlite
c280: 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68 65  3HashFind(&pSche
c290: 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79  ma->aFKey, pFKey
c2a0: 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20  ->zTo, nTo);.   
c2b0: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
c2c0: 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 61  sert(&pSchema->a
c2d0: 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f  FKey, pFKey->zTo
c2e0: 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20  , nTo, pFKey);. 
c2f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
c300: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
c310: 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e  e = 0;.    db->n
c320: 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d  Table++;.    db-
c330: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
c340: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
c350: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c360: 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
c370: 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c      if( !p->pSel
c380: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ect ){.      con
c390: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
c3a0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
c3b0: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
c3c0: 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  n.z;.      int n
c3d0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Name;.      asse
c3e0: 72 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20  rt( !pSelect && 
c3f0: 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b  pCons && pEnd );
c400: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73  .      if( pCons
c410: 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->z==0 ){.      
c420: 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a    pCons = pEnd;.
c430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e        }.      nN
c440: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
c450: 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a  r *)pCons->z - z
c460: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Name;.      p->a
c470: 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33  ddColOffset = 13
c480: 20 2b 20 73 71 6c 69 74 65 33 75 74 66 38 43 68   + sqlite3utf8Ch
c490: 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61  arLen(zName, nNa
c4a0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  me);.    }.#endi
c4b0: 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  f.  }.}..#ifndef
c4c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
c4d0: 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  W./*.** The pars
c4e0: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
c4f0: 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
c500: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
c510: 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
c520: 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20  te3CreateView(. 
c530: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c540: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
c550: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c560: 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20  Token *pBegin,  
c570: 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
c580: 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
c590: 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ns the statement
c5a0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
c5b0: 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me1,     /* The 
c5c0: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
c5d0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
c5e0: 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
c5f0: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
c600: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
c610: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
c620: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
c630: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
c640: 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
c650: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
c660: 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
c670: 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  w view */.  int 
c680: 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  isTemp,        /
c690: 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d  * TRUE for a TEM
c6a0: 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20  PORARY view */. 
c6b0: 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
c6c0: 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20      /* Suppress 
c6d0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
c6e0: 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65  f VIEW already e
c6f0: 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
c700: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
c710: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
c720: 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  d char *z;.  Tok
c730: 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
c740: 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e  er sFix;.  Token
c750: 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69   *pName;.  int i
c760: 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Db;..  if( pPars
c770: 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20  e->nVar>0 ){.   
c780: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
c790: 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65  (pParse, "parame
c7a0: 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c  ters are not all
c7b0: 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b  owed in views");
c7c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
c7d0: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
c7e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
c7f0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72   }.  sqlite3Star
c800: 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  tTable(pParse, p
c810: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69  Name1, pName2, i
c820: 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45  sTemp, 1, 0, noE
c830: 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  rr);.  p = pPars
c840: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
c850: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
c860: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
c870: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
c880: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
c890: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
c8a0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
c8b0: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
c8c0: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
c8d0: 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  e);.  iDb = sqli
c8e0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
c8f0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
c900: 70 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20  pSchema);.  if( 
c910: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
c920: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
c930: 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65  b, "view", pName
c940: 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  ).    && sqlite3
c950: 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c  FixSelect(&sFix,
c960: 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20   pSelect).  ){. 
c970: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
c980: 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b  Delete(pSelect);
c990: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
c9a0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f  ..  /* Make a co
c9b0: 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  py of the entire
c9c0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c9d0: 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
c9e0: 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68  he view..  ** Th
c9f0: 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c  is will force al
ca00: 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e  l the Expr.token
ca10: 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  .z values to be 
ca20: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a  dynamically.  **
ca30: 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65   allocated rathe
ca40: 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20  r than point to 
ca50: 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
ca60: 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74   - which means t
ca70: 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69  hat.  ** they wi
ca80: 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72  ll persist after
ca90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c   the current sql
caa0: 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c  ite3_exec() call
cab0: 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20   returns..  */. 
cac0: 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71   p->pSelect = sq
cad0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
cae0: 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
caf0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
cb00: 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 73  Select);.  if( s
cb10: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
cb20: 65 64 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ed() ){.    retu
cb30: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  rn;.  }.  if( !p
cb40: 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e  Parse->db->init.
cb50: 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  busy ){.    sqli
cb60: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
cb70: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
cb80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
cb90: 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
cba0: 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
cbb0: 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
cbc0: 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
cbd0: 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
cbe0: 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
cbf0: 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69  >sLastToken;.  i
cc00: 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20  f( sEnd.z[0]!=0 
cc10: 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b  && sEnd.z[0]!=';
cc20: 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20  ' ){.    sEnd.z 
cc30: 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20  += sEnd.n;.  }. 
cc40: 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e   sEnd.n = 0;.  n
cc50: 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67   = sEnd.z - pBeg
cc60: 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f  in->z;.  z = (co
cc70: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
cc80: 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20  r*)pBegin->z;.  
cc90: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a  while( n>0 && (z
cca0: 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73  [n-1]==';' || is
ccb0: 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29  space(z[n-1])) )
ccc0: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e  { n--; }.  sEnd.
ccd0: 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73  z = &z[n-1];.  s
cce0: 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  End.n = 1;..  /*
ccf0: 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54   Use sqlite3EndT
cd00: 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68  able() to add th
cd10: 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51  e view to the SQ
cd20: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
cd30: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e  e */.  sqlite3En
cd40: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  dTable(pParse, 0
cd50: 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72  , &sEnd, 0);.  r
cd60: 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
cd70: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
cd80: 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  IEW */..#if !def
cd90: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
cda0: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
cdb0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
cdc0: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a  IRTUALTABLE)./*.
cdd0: 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
cde0: 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73  ucture pTable is
cdf0: 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20   really a VIEW. 
ce00: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d   Fill in the nam
ce10: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  es of.** the col
ce20: 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77  umns of the view
ce30: 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73   in the pTable s
ce40: 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72  tructure.  Retur
ce50: 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  n the number.** 
ce60: 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
ce70: 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20  n error is seen 
ce80: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
ce90: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
cea0: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  ->zErrMsg..*/.in
ceb0: 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  t sqlite3ViewGet
cec0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73  ColumnNames(Pars
ced0: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
cee0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62   *pTable){.  Tab
cef0: 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f  le *pSelTab;   /
cf00: 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66  * A fake table f
cf10: 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74  rom which we get
cf20: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
cf30: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
cf40: 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  l;     /* Copy o
cf50: 66 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61  f the SELECT tha
cf60: 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
cf70: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e   view */.  int n
cf80: 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Err = 0;     /* 
cf90: 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  Number of errors
cfa0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a   encountered */.
cfb0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
cfc0: 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69      /* Temporari
cfd0: 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d  ly holds the num
cfe0: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61  ber of cursors a
cff0: 73 73 69 67 6e 65 64 20 2a 2f 0a 0a 20 20 61 73  ssigned */..  as
d000: 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a  sert( pTable );.
d010: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d020: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
d030: 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56  E.  if( sqlite3V
d040: 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70  tabCallConnect(p
d050: 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29  Parse, pTable) )
d060: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d070: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
d080: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
d090: 54 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20  Table) ) return 
d0a0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  0;.#endif..#ifnd
d0b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
d0c0: 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  IEW.  /* A posit
d0d0: 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
d0e0: 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
d0f0: 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
d100: 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
d110: 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
d120: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
d130: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
d140: 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
d150: 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
d160: 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
d170: 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
d180: 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
d190: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
d1a0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
d1b0: 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
d1c0: 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
d1d0: 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
d1e0: 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
d1f0: 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
d200: 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
d210: 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
d220: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
d230: 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
d240: 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
d250: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
d260: 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
d270: 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20  ROM one;.  **.  
d280: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69  ** Actually, thi
d290: 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68  s error is caugh
d2a0: 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64  t previously and
d2b0: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
d2c0: 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75  g test.  ** shou
d2d0: 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20  ld always fail. 
d2e0: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61   But we will lea
d2f0: 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a  ve it in place j
d300: 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a  ust to be safe..
d310: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
d320: 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  e->nCol<0 ){.   
d330: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
d340: 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25  (pParse, "view %
d350: 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20  s is circularly 
d360: 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65  defined", pTable
d370: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
d380: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73  turn 1;.  }.  as
d390: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43  sert( pTable->nC
d3a0: 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ol>=0 );..  /* I
d3b0: 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
d3c0: 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
d3d0: 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
d3e0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
d3f0: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
d400: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
d410: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
d420: 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e  ect() will expan
d430: 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65  d any.  ** "*" e
d440: 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72  lements in the r
d450: 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68  esults set of th
d460: 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20  e view and will 
d470: 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20  assign cursors. 
d480: 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65   ** to the eleme
d490: 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  nts of the FROM 
d4a0: 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20  clause.  But we 
d4b0: 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73  do not want thes
d4c0: 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  e changes.  ** t
d4d0: 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20  o be permanent. 
d4e0: 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74   So the computat
d4f0: 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61  ion is done on a
d500: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
d510: 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ECT.  ** stateme
d520: 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
d530: 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20  the view..  */. 
d540: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
d550: 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53  >pSelect );.  pS
d560: 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  el = sqlite3Sele
d570: 63 74 44 75 70 28 70 54 61 62 6c 65 2d 3e 70 53  ctDup(pTable->pS
d580: 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 70 53  elect);.  if( pS
d590: 65 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50  el ){.    n = pP
d5a0: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20  arse->nTab;.    
d5b0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
d5c0: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
d5d0: 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b  se, pSel->pSrc);
d5e0: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
d5f0: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 70 53 65 6c  l = -1;.    pSel
d600: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
d610: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
d620: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b  Parse, 0, pSel);
d630: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  .    pParse->nTa
d640: 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70  b = n;.    if( p
d650: 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20  SelTab ){.      
d660: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
d670: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
d680: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
d690: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
d6a0: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
d6b0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
d6c0: 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
d6d0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
d6e0: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
d6f0: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
d700: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
d710: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
d720: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
d730: 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e  ->flags |= DB_Un
d740: 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20 20  resetViews;.    
d750: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
d760: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
d770: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
d780: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
d790: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 29  lectDelete(pSel)
d7a0: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
d7b0: 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e   nErr++;.  }.#en
d7c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
d7d0: 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74  IT_VIEW */.  ret
d7e0: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65  urn nErr;  .}.#e
d7f0: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
d800: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
d810: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
d820: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
d830: 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66  ALTABLE) */..#if
d840: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d850: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  _VIEW./*.** Clea
d860: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
d870: 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49  es from every VI
d880: 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  EW in database i
d890: 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  dx..*/.static vo
d8a0: 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  id sqliteViewRes
d8b0: 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  etAll(sqlite3 *d
d8c0: 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48  b, int idx){.  H
d8d0: 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66  ashElem *i;.  if
d8e0: 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  ( !DbHasProperty
d8f0: 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
d900: 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74  esetViews) ) ret
d910: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  urn;.  for(i=sql
d920: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
d930: 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65  ->aDb[idx].pSche
d940: 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b  ma->tblHash); i;
d950: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
d960: 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  (i)){.    Table 
d970: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
d980: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
d990: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
d9a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d9b0: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
d9c0: 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTab);.    }.  
d9d0: 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65  }.  DbClearPrope
d9e0: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
d9f0: 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d  UnresetViews);.}
da00: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
da10: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
da20: 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f  ll(A,B).#endif /
da30: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
da40: 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  EW */../*.** Thi
da50: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
da60: 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45  lled by the VDBE
da70: 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69   to adjust the i
da80: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
da90: 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65  * used by SQLite
daa0: 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20   when the btree 
dab0: 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61  layer moves a ta
dac0: 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54  ble root page. T
dad0: 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20  he.** root-page 
dae0: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
daf0: 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20  dex in database 
db00: 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20  iDb has changed 
db10: 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f  from iFrom.** to
db20: 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b   iTo..**.** Tick
db30: 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73  et #1728:  The s
db40: 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68  ymbol table migh
db50: 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  t still contain 
db60: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f  information.** o
db70: 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20  n tables and/or 
db80: 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65  indices that are
db90: 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
dba0: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a  being deleted..*
dbb0: 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c  * If you are unl
dbc0: 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f  ucky, one of tho
dbd0: 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  se deleted indic
dbe0: 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67  es or tables mig
dbf0: 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73  ht.** have the s
dc00: 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d  ame rootpage num
dc10: 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20  ber as the real 
dc20: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
dc30: 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20  hat is.** being 
dc40: 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61  moved.  So we ca
dc50: 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68  nnot stop search
dc60: 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69  ing after the fi
dc70: 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65  rst match .** be
dc80: 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20  cause the first 
dc90: 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66  match might be f
dca0: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65  or one of the de
dcb0: 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a  leted indices.**
dcc0: 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e   or tables and n
dcd0: 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64  ot the table/ind
dce0: 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61  ex that is actua
dcf0: 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e  lly being moved.
dd00: 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74  .** We must cont
dd10: 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74  inue looping unt
dd20: 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e  il all tables an
dd30: 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a  d indices with.*
dd40: 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f  * rootpage==iFro
dd50: 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76  m have been conv
dd60: 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20  erted to have a 
dd70: 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a  rootpage of iTo.
dd80: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ** in order to b
dd90: 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77  e certain that w
dda0: 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20  e got the right 
ddb0: 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  one..*/.#ifndef 
ddc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
ddd0: 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69  VACUUM.void sqli
dde0: 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64  te3RootPageMoved
ddf0: 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46  (Db *pDb, int iF
de00: 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
de10: 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d   HashElem *pElem
de20: 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b  ;.  Hash *pHash;
de30: 0a 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  ..  pHash = &pDb
de40: 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
de50: 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
de60: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
de70: 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
de80: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
de90: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
dea0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
deb0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
dec0: 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54  lem);.    if( pT
ded0: 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  ab->tnum==iFrom 
dee0: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  ){.      pTab->t
def0: 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
df00: 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26  .  }.  pHash = &
df10: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  pDb->pSchema->id
df20: 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  xHash;.  for(pEl
df30: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
df40: 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
df50: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
df60: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
df70: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
df80: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
df90: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
dfa0: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pIdx->tnum==iFr
dfb0: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  om ){.      pIdx
dfc0: 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
dfd0: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
dfe0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f  ../*.** Write co
dff0: 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20  de to erase the 
e000: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
e010: 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d  page iTable from
e020: 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a   database iDb..*
e030: 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64  * Also write cod
e040: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
e050: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
e060: 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  ble and internal
e070: 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20   schema.** if a 
e080: 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f  root-page of ano
e090: 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
e0a0: 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
e0b0: 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a  -layer whilst.**
e0c0: 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20   erasing iTable 
e0d0: 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
e0e0: 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
e0f0: 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
e100: 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
e110: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
e120: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
e130: 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69  nt iTable, int i
e140: 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
e150: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
e160: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
e170: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e180: 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c  P_Destroy, iTabl
e190: 65 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66  e, iDb);.#ifndef
e1a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
e1b0: 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f  OVACUUM.  /* OP_
e1c0: 44 65 73 74 72 6f 79 20 70 75 73 68 65 73 20 61  Destroy pushes a
e1d0: 6e 20 69 6e 74 65 67 65 72 20 6f 6e 74 6f 20 74  n integer onto t
e1e0: 68 65 20 73 74 61 63 6b 2e 20 49 66 20 74 68 69  he stack. If thi
e1f0: 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69  s integer.  ** i
e200: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
e210: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
e220: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
e230: 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a   table moved to.
e240: 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54    ** location iT
e250: 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  able. The follow
e260: 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65  ing code modifie
e270: 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  s the sqlite_mas
e280: 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a  ter table to.  *
e290: 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a  * reflect this..
e2a0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23    **.  ** The "#
e2b0: 30 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73  0" in the SQL is
e2c0: 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74   a special const
e2d0: 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ant that means w
e2e0: 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20  hatever value.  
e2f0: 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70  ** is on the top
e300: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20   of the stack.  
e310: 53 65 65 20 73 71 6c 69 74 65 33 52 65 67 69 73  See sqlite3Regis
e320: 74 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a  terExpr()..  */.
e330: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
e340: 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
e350: 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
e360: 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64   SET rootpage=%d
e370: 20 57 48 45 52 45 20 23 30 20 41 4e 44 20 72 6f   WHERE #0 AND ro
e380: 6f 74 70 61 67 65 3d 23 30 22 2c 0a 20 20 20 20  otpage=#0",.    
e390: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
e3a0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
e3b0: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
e3c0: 69 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  iTable);.#endif.
e3d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56  }../*.** Write V
e3e0: 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73  DBE code to eras
e3f0: 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  e table pTab and
e400: 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
e410: 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e  indices on disk.
e420: 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61  .** Code to upda
e430: 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  te the sqlite_ma
e440: 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20  ster tables and 
e450: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
e460: 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69  definitions.** i
e470: 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61  n case a root-pa
e480: 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
e490: 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
e4a0: 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
e4b0: 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20  ree layer.** is 
e4c0: 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73  also added (this
e4d0: 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
e4e0: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
e4f0: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
e500: 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
e510: 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  yTable(Parse *pP
e520: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
e530: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
e540: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
e550: 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  M.  Index *pIdx;
e560: 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
e570: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
e580: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
e590: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
e5a0: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
e5b0: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e  pParse, pTab->tn
e5c0: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28  um, iDb);.  for(
e5d0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
e5e0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
e5f0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
e600: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
e610: 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e  pParse, pIdx->tn
e620: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65  um, iDb);.  }.#e
e630: 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  lse.  /* If the 
e640: 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
e650: 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
e660: 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f  ble (if SQLITE_O
e670: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
e680: 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e   ** is not defin
e690: 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ed), then it is 
e6a0: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c  important to cal
e6b0: 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20  l OP_Destroy on 
e6c0: 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61  the.  ** table a
e6d0: 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61  nd index root-pa
e6e0: 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74  ges in order, st
e6f0: 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
e700: 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a  numerically .  *
e710: 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  * largest root-p
e720: 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
e730: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
e740: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f   none of the roo
e750: 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20  t-pages.  ** to 
e760: 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  be destroyed is 
e770: 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  relocated by an 
e780: 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72  earlier OP_Destr
e790: 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a  oy. i.e. if the.
e7a0: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
e7b0: 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a  ere coded:.  **.
e7c0: 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
e7d0: 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a  4 0.  ** ....  *
e7e0: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30  * OP_Destroy 5 0
e7f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72  .  **.  ** and r
e800: 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65  oot page 5 happe
e810: 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  ned to be the la
e820: 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
e830: 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
e840: 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
e850: 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f  n root page 5 wo
e860: 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20  uld be moved to 
e870: 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20  page 4 by the . 
e880: 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20   ** "OP_Destroy 
e890: 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65  4 0" opcode. The
e8a0: 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f   subsequent "OP_
e8b0: 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75  Destroy 5 0" wou
e8c0: 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72  ld hit.  ** a fr
e8d0: 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20  ee-list page..  
e8e0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
e8f0: 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e  pTab->tnum;.  in
e900: 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30  t iDestroyed = 0
e910: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
e920: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
e930: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65  ;.    int iLarge
e940: 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  st = 0;..    if(
e950: 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c   iDestroyed==0 |
e960: 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65  | iTab<iDestroye
e970: 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67  d ){.      iLarg
e980: 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  est = iTab;.    
e990: 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  }.    for(pIdx=p
e9a0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
e9b0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
e9c0: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
e9d0: 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75  iIdx = pIdx->tnu
e9e0: 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
e9f0: 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
ea00: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
ea10: 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73  .      if( (iDes
ea20: 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49  troyed==0 || (iI
ea30: 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20  dx<iDestroyed)) 
ea40: 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74  && iIdx>iLargest
ea50: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72   ){.        iLar
ea60: 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20  gest = iIdx;.   
ea70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
ea80: 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29  f( iLargest==0 )
ea90: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
eaa0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eab0: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
eac0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
ead0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
eae0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
eaf0: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
eb00: 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
eb10: 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  st, iDb);.      
eb20: 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61  iDestroyed = iLa
eb30: 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  rgest;.    }.  }
eb40: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
eb50: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
eb60: 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
eb70: 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
eb80: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
eb90: 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
eba0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
ebb0: 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
ebc0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
ebd0: 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  e3DropTable(Pars
ebe0: 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
ebf0: 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
ec00: 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72  sView, int noErr
ec10: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
ec20: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
ec30: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
ec40: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
ec50: 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Db;..  if( pPars
ec60: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
ec70: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
ec80: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
ec90: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
eca0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  }.  assert( pNam
ecb0: 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
ecc0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
ecd0: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
ece0: 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
ecf0: 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
ed00: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20  .zDatabase);..  
ed10: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
ed20: 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 7b 0a     if( noErr ){.
ed30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
ed40: 6f 72 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  orClear(pParse);
ed50: 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20  .    }.    goto 
ed60: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
ed70: 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
ed80: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
ed90: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
eda0: 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
edb0: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
edc0: 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66  ->nDb );.#ifndef
edd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ede0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
edf0: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
ee00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
ee10: 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
ee20: 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74  (iDb);.    const
ee30: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
ee40: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
ee50: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
ee60: 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20  *zArg2 = 0;.    
ee70: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
ee80: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
ee90: 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
eea0: 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20  , 0, zDb)){.    
eeb0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
eec0: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
eed0: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
eee0: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
eef0: 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
ef00: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
ef10: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
ef20: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
ef30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
ef40: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
ef50: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  P_VIEW;.      }.
ef60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ef70: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
ef80: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49  .    }else if( I
ef90: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
efa0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
efb0: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
efc0: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
efd0: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67  ab) ){.        g
efe0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
eff0: 62 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ble;.      }.   
f000: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
f010: 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20  _DROP_VTABLE;.  
f020: 20 20 20 20 7a 41 72 67 32 20 3d 20 70 54 61 62      zArg2 = pTab
f030: 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23  ->pMod->zName;.#
f040: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
f050: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
f060: 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
f070: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
f080: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
f090: 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
f0a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f0b0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
f0c0: 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ROP_TABLE;.     
f0d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
f0e0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
f0f0: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
f100: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72  pTab->zName, zAr
f110: 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  g2, zDb) ){.    
f120: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
f130: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
f140: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
f150: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
f160: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54  QLITE_DELETE, pT
f170: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  ab->zName, 0, zD
f180: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
f190: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
f1a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
f1b0: 69 66 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72  if.  if( pTab->r
f1c0: 65 61 64 4f 6e 6c 79 20 7c 7c 20 70 54 61 62 3d  eadOnly || pTab=
f1d0: 3d 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  =db->aDb[iDb].pS
f1e0: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 29  chema->pSeqTab )
f1f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
f200: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
f210: 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20  able %s may not 
f220: 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61  be dropped", pTa
f230: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
f240: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
f250: 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ble;.  }..#ifnde
f260: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
f270: 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44  EW.  /* Ensure D
f280: 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74  ROP TABLE is not
f290: 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c   used on a view,
f2a0: 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69   and DROP VIEW i
f2b0: 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20  s not used.  ** 
f2c0: 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  on a table..  */
f2d0: 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26  .  if( isView &&
f2e0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
f2f0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
f300: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f310: 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45   "use DROP TABLE
f320: 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65   to delete table
f330: 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
f340: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
f350: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
f360: 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  }.  if( !isView 
f370: 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
f380: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
f390: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
f3a0: 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74  "use DROP VIEW t
f3b0: 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73  o delete view %s
f3c0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
f3d0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
f3e0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
f3f0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
f400: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
f410: 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72  ove the table fr
f420: 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
f430: 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b  ble.  ** on disk
f440: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
f450: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
f460: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
f470: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
f480: 69 67 67 65 72 3b 0a 20 20 20 20 44 62 20 2a 70  igger;.    Db *p
f490: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
f4a0: 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  b];.    sqlite3B
f4b0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
f4c0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
f4d0: 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
f4e0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
f4f0: 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 49 73  TABLE.    if( Is
f500: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
f510: 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d  .      Vdbe *v =
f520: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
f530: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
f540: 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20 20 20  f( v ){.        
f550: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f560: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30  (v, OP_VBegin, 0
f570: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
f580: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
f590: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67  /* Drop all trig
f5a0: 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  gers associated 
f5b0: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62  with the table b
f5c0: 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f  eing dropped. Co
f5d0: 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e  de.    ** is gen
f5e0: 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65  erated to remove
f5f0: 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71   entries from sq
f600: 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f  lite_master and/
f610: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
f620: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20  _temp_master if 
f630: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
f640: 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
f650: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a  pTab->pTrigger;.
f660: 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67      while( pTrig
f670: 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ger ){.      ass
f680: 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70  ert( pTrigger->p
f690: 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
f6a0: 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20  chema || .      
f6b0: 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53      pTrigger->pS
f6c0: 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
f6d0: 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
f6e0: 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
f6f0: 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
f700: 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20   pTrigger);.    
f710: 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72    pTrigger = pTr
f720: 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  igger->pNext;.  
f730: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
f740: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
f750: 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65  REMENT.    /* Re
f760: 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73  move any entries
f770: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   of the sqlite_s
f780: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73  equence table as
f790: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20  sociated with.  
f7a0: 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
f7b0: 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68  eing dropped. Th
f7c0: 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72  is is done befor
f7d0: 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64  e the table is d
f7e0: 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20 61 74  ropped.    ** at
f7f0: 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c   the btree level
f800: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71  , in case the sq
f810: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
f820: 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ble needs to.   
f830: 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65   ** move as a re
f840: 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70  sult of the drop
f850: 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20   (can happen in 
f860: 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
f870: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
f880: 28 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20  ( pTab->autoInc 
f890: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f8a0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
f8b0: 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c  se,.        "DEL
f8c0: 45 54 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69  ETE FROM %s.sqli
f8d0: 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52  te_sequence WHER
f8e0: 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20  E name=%Q",.    
f8f0: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20      pDb->zName, 
f900: 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
f910: 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69    );.    }.#endi
f920: 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61  f..    /* Drop a
f930: 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ll SQLITE_MASTER
f940: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
f950: 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65   entries that re
f960: 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  fer to the.    *
f970: 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f  * table. The pro
f980: 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20  gram name loops 
f990: 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74  through the mast
f9a0: 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c  er table and del
f9b0: 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72  etes.    ** ever
f9c0: 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72  y row that refer
f9d0: 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20  s to a table of 
f9e0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
f9f0: 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20   the one being. 
fa00: 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54     ** dropped. T
fa10: 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64  riggers are hand
fa20: 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79 20 62  led seperately b
fa30: 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72  ecause a trigger
fa40: 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63   can be.    ** c
fa50: 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65  reated in the te
fa60: 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74  mp database that
fa70: 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
fa80: 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20  le in another.  
fa90: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
faa0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
fab0: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
fac0: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44  rse, .        "D
fad0: 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
fae0: 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d   WHERE tbl_name=
faf0: 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72  %Q and type!='tr
fb00: 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20  igger'",.       
fb10: 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48   pDb->zName, SCH
fb20: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
fb30: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
fb40: 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
fb50: 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
fb60: 29 20 29 7b 0a 20 20 20 20 20 20 64 65 73 74 72  ) ){.      destr
fb70: 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  oyTable(pParse, 
fb80: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  pTab);.    }..  
fb90: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
fba0: 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d  table entry from
fbb0: 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e   SQLite's intern
fbc0: 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f  al schema and mo
fbd0: 64 69 66 79 0a 20 20 20 20 2a 2a 20 74 68 65 20  dify.    ** the 
fbe0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20  schema cookie.. 
fbf0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 73     */.    if( Is
fc00: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
fc10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fc20: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 56 44 65 73  beOp3(v, OP_VDes
fc30: 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 70 54  troy, iDb, 0, pT
fc40: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
fc50: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
fc60: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72  VdbeOp3(v, OP_Dr
fc70: 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c  opTable, iDb, 0,
fc80: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
fc90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
fca0: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c  ngeCookie(db, v,
fcb0: 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   iDb);.  }.  sql
fcc0: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
fcd0: 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f  db, iDb);..exit_
fce0: 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71  drop_table:.  sq
fcf0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
fd00: 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  te(pName);.}../*
fd10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
fd20: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72   is called to cr
fd30: 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69  eate a new forei
fd40: 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61  gn key on the ta
fd50: 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ble.** currently
fd60: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
fd70: 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64  ion.  pFromCol d
fd80: 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
fd90: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
fda0: 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
fdb0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72  point to the for
fdc0: 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46  eign key.  If pF
fdd0: 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a  romCol==0 then.*
fde0: 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65  * connect the ke
fdf0: 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f  y to the last co
fe00: 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20  lumn inserted.  
fe10: 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20  pTo is the name 
fe20: 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  of.** the table 
fe30: 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54  referred to.  pT
fe40: 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f  oCol is a list o
fe50: 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
fe60: 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62  other.** pTo tab
fe70: 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65  le that the fore
fe80: 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74  ign key points t
fe90: 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69  o.  flags contai
fea0: 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  ns all.** inform
feb0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
fec0: 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
fed0: 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73  ion algorithms s
fee0: 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74  pecified.** in t
fef0: 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e  he ON DELETE, ON
ff00: 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49   UPDATE and ON I
ff10: 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a  NSERT clauses..*
ff20: 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72  *.** An FKey str
ff30: 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
ff40: 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  d and added to t
ff50: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
ff60: 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73  ly.** under cons
ff70: 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
ff80: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
ff90: 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65  e field.  The ne
ffa0: 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74  w FKey.** is not
ffb0: 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d   linked into db-
ffc0: 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73 20 70  >aFKey at this p
ffd0: 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73  oint - that does
ffe0: 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75   not happen.** u
fff0: 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54  ntil sqlite3EndT
10000 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  able()..**.** Th
10010 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  e foreign key is
10020 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41   set for IMMEDIA
10030 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  TE processing.  
10040 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  A subsequent cal
10050 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44  l.** to sqlite3D
10060 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29  eferForeignKey()
10070 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
10080 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a  is to DEFERRED..
10090 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
100a0 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28  reateForeignKey(
100b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
100c0 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
100d0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
100e0 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43  ExprList *pFromC
100f0 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ol,  /* Columns 
10100 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68  in this table th
10110 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65  at point to othe
10120 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b  r table */.  Tok
10130 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20  en *pTo,        
10140 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
10150 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
10160 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43    ExprList *pToC
10170 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
10180 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74  s in the other t
10190 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  able */.  int fl
101a0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
101b0 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
101c0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
101d0 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  . */.){.#ifndef 
101e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
101f0 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a  IGN_KEY.  FKey *
10200 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61 62  pFKey = 0;.  Tab
10210 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  le *p = pParse->
10220 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74  pNewTable;.  int
10230 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
10240 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63  .  int nCol;.  c
10250 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72  har *z;..  asser
10260 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69  t( pTo!=0 );.  i
10270 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
10280 65 2d 3e 6e 45 72 72 20 7c 7c 20 49 4e 5f 44 45  e->nErr || IN_DE
10290 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
102a0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
102b0 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
102c0 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
102d0 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
102e0 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66   iCol<0 ) goto f
102f0 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  k_end;.    if( p
10300 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
10310 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
10320 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10330 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65  sg(pParse, "fore
10340 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20  ign key on %s". 
10350 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64          " should
10360 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
10370 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
10380 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20  ble %T",.       
10390 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e    p->aCol[iCol].
103a0 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20  zName, pTo);.   
103b0 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
103c0 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
103d0 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
103e0 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
103f0 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f  ->nExpr!=pFromCo
10400 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  l->nExpr ){.    
10410 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10420 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
10430 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  "number of colum
10440 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
10450 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
10460 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
10470 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e  .        "column
10480 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
10490 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20  ced table");.   
104a0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
104b0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
104c0 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  = pFromCol->nExp
104d0 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  r;.  }.  nByte =
104e0 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
104f0 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46  + nCol*sizeof(pF
10500 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20  Key->aCol[0]) + 
10510 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66  pTo->n + 1;.  if
10520 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
10530 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f  for(i=0; i<pToCo
10540 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  l->nExpr; i++){.
10550 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73        nByte += s
10560 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b  trlen(pToCol->a[
10570 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
10580 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
10590 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
105a0 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
105b0 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20  pFKey==0 ) goto 
105c0 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d  fk_end;.  pFKey-
105d0 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46  >pFrom = p;.  pF
105e0 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d  Key->pNextFrom =
105f0 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d   p->pFKey;.  z =
10600 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31   (char*)&pFKey[1
10610 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  ];.  pFKey->aCol
10620 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d   = (struct sColM
10630 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69  ap*)z;.  z += si
10640 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c  zeof(struct sCol
10650 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b  Map)*nCol;.  pFK
10660 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
10670 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
10680 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
10690 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b  o->n] = 0;.  z +
106a0 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
106b0 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30  Key->pNextTo = 0
106c0 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
106d0 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46  = nCol;.  if( pF
106e0 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
106f0 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e   pFKey->aCol[0].
10700 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  iFrom = p->nCol-
10710 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
10720 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
10730 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
10740 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
10750 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b  0; j<p->nCol; j+
10760 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
10770 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
10780 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
10790 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
107a0 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
107b0 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
107c0 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
107d0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
107e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
107f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
10800 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
10810 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10820 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
10830 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20         "unknown 
10840 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e  column \"%s\" in
10850 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
10860 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20  inition", .     
10870 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61       pFromCol->a
10880 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
10890 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
108a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
108b0 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
108c0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
108d0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
108e0 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
108f0 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
10900 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
10910 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
10920 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
10930 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
10940 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
10950 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
10960 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
10970 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
10980 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
10990 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74  ;.  pFKey->delet
109a0 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20  eConf = flags & 
109b0 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75  0xff;.  pFKey->u
109c0 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61  pdateConf = (fla
109d0 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
109e0 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72  ;.  pFKey->inser
109f0 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  tConf = (flags >
10a00 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a  > 16 ) & 0xff;..
10a10 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
10a20 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
10a30 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
10a40 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
10a50 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
10a60 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
10a70 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
10a80 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e  Free(pFKey);.#en
10a90 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
10aa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
10ab0 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71  IGN_KEY) */.  sq
10ac0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
10ad0 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20  ete(pFromCol);. 
10ae0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
10af0 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a  Delete(pToCol);.
10b00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
10b10 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
10b20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c  when an INITIALL
10b30 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49  Y IMMEDIATE or I
10b40 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
10b50 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73  D.** clause is s
10b60 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61  een as part of a
10b70 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
10b80 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73  inition.  The is
10b90 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61  Deferred.** para
10ba0 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49  meter is 1 for I
10bb0 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
10bc0 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54  D and 0 for INIT
10bd0 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e  IALLY IMMEDIATE.
10be0 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72  .** The behavior
10bf0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
10c00 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f  ently created fo
10c10 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a  reign key is adj
10c20 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69  usted.** accordi
10c30 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ngly..*/.void sq
10c40 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
10c50 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72  nKey(Parse *pPar
10c60 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72  se, int isDeferr
10c70 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ed){.#ifndef SQL
10c80 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
10c90 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54  _KEY.  Table *pT
10ca0 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  ab;.  FKey *pFKe
10cb0 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d  y;.  if( (pTab =
10cc0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
10cd0 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79  le)==0 || (pFKey
10ce0 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d   = pTab->pFKey)=
10cf0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
10d00 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
10d10 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a 23   = isDeferred;.#
10d20 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  endif.}../*.** G
10d30 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
10d40 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64  t will erase and
10d50 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70   refill index *p
10d60 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  Idx.  This is.**
10d70 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   used to initial
10d80 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61  ize a newly crea
10d90 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20  ted index or to 
10da0 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  recompute the.**
10db0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69   content of an i
10dc0 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65  ndex in response
10dd0 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f   to a REINDEX co
10de0 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20  mmand..**.** if 
10df0 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
10e00 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20  ot negative, it 
10e10 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69  means that the i
10e20 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a  ndex is newly.**
10e30 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 6d   created.  The m
10e40 65 6d 6f 72 79 20 63 65 6c 6c 20 73 70 65 63 69  emory cell speci
10e50 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50  fied by memRootP
10e60 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  age contains the
10e70 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  .** root page nu
10e80 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
10e90 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61  x.  If memRootPa
10ea0 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
10eb0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  then.** the inde
10ec0 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
10ed0 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65   and must be cle
10ee0 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
10ef0 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a  g refilled and.*
10f00 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
10f10 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
10f20 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  dex is taken fro
10f30 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a  m pIndex->tnum..
10f40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
10f50 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
10f60 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
10f70 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
10f80 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29  int memRootPage)
10f90 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
10fa0 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
10fb0 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  ;  /* The table 
10fc0 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20  that is indexed 
10fd0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
10fe0 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20  pParse->nTab;   
10ff0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
11000 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61  sor used for pTa
11010 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  b */.  int iIdx 
11020 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31  = pParse->nTab+1
11030 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
11040 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
11050 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61  Index */.  int a
11060 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
11070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
11080 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c  ress of top of l
11090 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75  oop */.  int tnu
110a0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
110b0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
110c0 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  page of index */
110d0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
110e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110f0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
11100 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72  de into this vir
11110 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a  tual machine */.
11120 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b    KeyInfo *pKey;
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11140 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20   /* KeyInfo for 
11150 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
11160 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
11170 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
11180 2d 3e 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  ->db, pIndex->pS
11190 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
111a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
111b0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
111c0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
111d0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
111e0 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78  _REINDEX, pIndex
111f0 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20  ->zName, 0,.    
11200 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
11210 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29  b[iDb].zName ) )
11220 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
11230 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
11240 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  equire a write-l
11250 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
11260 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73   to perform this
11270 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
11280 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
11290 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
112a0 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61  ab->tnum, 1, pTa
112b0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20  b->zName);..  v 
112c0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
112d0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
112e0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
112f0 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
11300 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
11310 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11320 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f  P_MemLoad, memRo
11330 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  otPage, 0);.    
11340 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tnum = 0;.  }els
11350 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49  e{.    tnum = pI
11360 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  ndex->tnum;.    
11370 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11380 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e  (v, OP_Clear, tn
11390 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20  um, iDb);.  }.  
113a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
113b0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
113c0 69 44 62 2c 20 30 29 3b 0a 20 20 70 4b 65 79 20  iDb, 0);.  pKey 
113d0 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
113e0 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
113f0 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  ndex);.  sqlite3
11400 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
11410 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74  enWrite, iIdx, t
11420 6e 75 6d 2c 20 28 63 68 61 72 20 2a 29 70 4b 65  num, (char *)pKe
11430 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P3_KEYINFO_HA
11440 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65  NDOFF);.  sqlite
11450 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
11460 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
11470 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
11480 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
11490 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
114a0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
114b0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65   0);.  sqlite3Ge
114c0 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 76  nerateIndexKey(v
114d0 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62 29 3b  , pIndex, iTab);
114e0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f  .  if( pIndex->o
114f0 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
11500 29 7b 0a 20 20 20 20 69 6e 74 20 63 75 72 61 64  ){.    int curad
11510 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
11520 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
11530 20 20 20 20 69 6e 74 20 61 64 64 72 32 20 3d 20      int addr2 = 
11540 63 75 72 61 64 64 72 2b 34 3b 0a 20 20 20 20 73  curaddr+4;.    s
11550 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
11560 50 32 28 76 2c 20 63 75 72 61 64 64 72 2d 31 2c  P2(v, curaddr-1,
11570 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73 71 6c   addr2);.    sql
11580 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11590 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c   OP_Rowid, iTab,
115a0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
115b0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
115c0 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29 3b 0a 20  AddImm, 1, 0);. 
115d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
115e0 64 4f 70 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71  dOp(v, OP_IsUniq
115f0 75 65 2c 20 69 49 64 78 2c 20 61 64 64 72 32 29  ue, iIdx, addr2)
11600 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11610 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  eOp3(v, OP_Halt,
11620 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
11630 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c 0a 20 20  NT, OE_Abort,.  
11640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11650 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d    "indexed colum
11660 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75  ns are not uniqu
11670 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  e", P3_STATIC);.
11680 20 20 20 20 61 73 73 65 72 74 28 20 61 64 64 72      assert( addr
11690 32 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 43 75  2==sqlite3VdbeCu
116a0 72 72 65 6e 74 41 64 64 72 28 76 29 20 29 3b 0a  rrentAddr(v) );.
116b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
116c0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
116d0 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 30 29  Insert, iIdx, 0)
116e0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
116f0 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
11700 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b   iTab, addr1+1);
11710 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
11720 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
11730 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
11740 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
11750 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73 71  , iTab, 0);.  sq
11760 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11770 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78  , OP_Close, iIdx
11780 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , 0);.}../*.** C
11790 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
117a0 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
117b0 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d  le.  pName1.pNam
117c0 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  e2 is the name o
117d0 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
117e0 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20  and pTblList is 
117f0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
11800 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
11810 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
11820 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
11830 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
11840 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
11850 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
11860 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
11870 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
11880 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
11890 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
118a0 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
118b0 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
118c0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
118d0 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
118e0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
118f0 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
11900 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
11910 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
11920 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
11930 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
11940 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
11950 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
11960 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
11970 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
11980 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
11990 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
119a0 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
119b0 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
119c0 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
119d0 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
119e0 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
119f0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
11a00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11a10 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
11a20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11a30 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
11a40 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
11a50 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
11a60 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
11a70 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69   First part of i
11a80 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
11a90 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
11aa0 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
11ab0 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
11ac0 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
11ad0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
11ae0 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c  cList *pTblName,
11af0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64   /* Table to ind
11b00 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e  ex. Use pParse->
11b10 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
11b20 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
11b30 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
11b40 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
11b50 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
11b60 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
11b70 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
11b80 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
11b90 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
11ba0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
11bb0 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  art,     /* The 
11bc0 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
11bd0 74 20 62 65 67 69 6e 73 20 61 20 43 52 45 41 54  t begins a CREAT
11be0 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
11bf0 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  t */.  Token *pE
11c00 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  nd,       /* The
11c10 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73   ")" that closes
11c20 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
11c30 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
11c40 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20   int sortOrder, 
11c50 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65      /* Sort orde
11c60 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79  r of primary key
11c70 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c   when pList==NUL
11c80 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74  L */.  int ifNot
11c90 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69  Exist     /* Omi
11ca0 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78  t error if index
11cb0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
11cc0 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
11cd0 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Tab = 0;     /* 
11ce0 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
11cf0 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
11d00 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a  pIndex = 0;   /*
11d10 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
11d20 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
11d30 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20  ar *zName = 0;  
11d40 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
11d50 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
11d60 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
11d70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
11d80 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61  haracters in zNa
11d90 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  me */.  int i, j
11da0 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64  ;.  Token nullId
11db0 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65  ;        /* Fake
11dc0 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
11dd0 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
11de0 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
11df0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73        /* For ass
11e00 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
11e10 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
11e20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
11e30 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74  erMask;   /* 1 t
11e40 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20  o honor DESC in 
11e50 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e  index.  0 to ign
11e60 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ore. */.  sqlite
11e70 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
11e80 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  db;.  Db *pDb;  
11e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11ea0 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65  e specific table
11eb0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
11ec0 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65  indexed database
11ed0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
11ee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
11ef0 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
11f00 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e  ase that is bein
11f10 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54  g written */.  T
11f20 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
11f30 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
11f40 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
11f50 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
11f60 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
11f70 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49  ist_item *pListI
11f80 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  tem; /* For loop
11f90 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a  ing over pList *
11fa0 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  /.  int nCol;.  
11fb0 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a  int nExtra = 0;.
11fc0 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a    char *zExtra;.
11fd0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
11fe0 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61  Err || sqlite3Ma
11ff0 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 7c 7c 20  llocFailed() || 
12000 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
12010 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
12020 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12030 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
12040 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
12050 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
12060 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
12070 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
12080 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e    */.  if( pTblN
12090 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f  ame!=0 ){..    /
120a0 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61  * Use the two-pa
120b0 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f  rt index name to
120c0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64   determine the d
120d0 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
120e0 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68  to search for th
120f0 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74  e table. 'Fix' t
12100 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  he table name to
12110 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20   this db.    ** 
12120 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75  before looking u
12130 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  p the table..   
12140 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
12150 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32  pName1 && pName2
12160 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
12170 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
12180 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
12190 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
121a0 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
121b0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
121c0 74 65 5f 69 6e 64 65 78 3b 0a 0a 23 69 66 6e 64  te_index;..#ifnd
121d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
121e0 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20  EMPDB.    /* If 
121f0 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77  the index name w
12200 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20  as unqualified, 
12210 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 68 65  check if the the
12220 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73   table.    ** is
12230 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49   a temp table. I
12240 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61  f so, set the da
12250 74 61 62 61 73 65 20 74 6f 20 31 2e 0a 20 20 20  tabase to 1..   
12260 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 73   */.    pTab = s
12270 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f  qlite3SrcListLoo
12280 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c  kup(pParse, pTbl
12290 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
122a0 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d  Name2 && pName2-
122b0 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26  >n==0 && pTab &&
122c0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d   pTab->pSchema==
122d0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
122e0 6d 61 20 29 7b 0a 20 20 20 20 20 20 69 44 62 20  ma ){.      iDb 
122f0 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
12300 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  f..    if( sqlit
12310 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
12320 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
12330 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26  ndex", pName) &&
12340 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12350 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78  FixSrcList(&sFix
12360 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20  , pTblName).    
12370 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61  ){.      /* Beca
12380 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63  use the parser c
12390 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61  onstructs pTblNa
123a0 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  me from a single
123b0 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20   identifier,.   
123c0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78     ** sqlite3Fix
123d0 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65  SrcList can neve
123e0 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20  r fail. */.     
123f0 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20   assert(0);.    
12400 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  }.    pTab = sql
12410 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
12420 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
12430 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20  ->a[0].zName, . 
12440 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d         pTblName-
12450 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
12460 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20  ;.    if( !pTab 
12470 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
12480 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
12490 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44  sert( db->aDb[iD
124a0 62 5d 2e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  b].pSchema==pTab
124b0 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d  ->pSchema );.  }
124c0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
124d0 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  ( pName==0 );.  
124e0 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d    pTab = pParse-
124f0 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >pNewTable;.    
12500 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
12510 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12520 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ex;.    iDb = sq
12530 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
12540 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
12550 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62  hema);.  }.  pDb
12560 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
12570 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  ;..  if( pTab==0
12580 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
12590 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
125a0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28  ate_index;.  if(
125b0 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20   pTab->readOnly 
125c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
125d0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
125e0 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
125f0 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54   be indexed", pT
12600 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
12610 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12620 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
12630 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12640 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d  VIEW.  if( pTab-
12650 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
12660 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12670 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
12680 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
12690 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
126a0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
126b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
126c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
126d0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
126e0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
126f0 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
12700 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12710 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65  , "virtual table
12720 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
12730 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
12740 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12750 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ex;.  }.#endif..
12760 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
12770 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
12780 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
12790 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
127a0 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
127b0 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
127c0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
127d0 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
127e0 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
127f0 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
12800 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
12810 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
12820 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
12830 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
12840 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
12850 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
12860 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
12870 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
12880 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
12890 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
128a0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
128b0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
128c0 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
128d0 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
128e0 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
128f0 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  s index..  **.  
12900 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69  ** If pName==0 i
12910 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
12920 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67  are.  ** dealing
12930 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20   with a primary 
12940 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  key or UNIQUE co
12950 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61  nstraint.  We ha
12960 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72  ve to invent our
12970 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a  .  ** own name..
12980 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65    */.  if( pName
12990 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
129a0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
129b0 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20  oken(pName);.   
129c0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
129d0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
129e0 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f  a(pParse) ) goto
129f0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12a00 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  ex;.    if( zNam
12a10 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
12a20 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12a30 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
12a40 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
12a50 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
12a60 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
12a70 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12a80 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
12a90 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
12aa0 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69  .busy ){.      i
12ab0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
12ac0 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
12ad0 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65  pParse) ) goto e
12ae0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12af0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
12b00 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
12b10 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
12b20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12b30 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12b40 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
12b50 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64  dy a table named
12b60 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
12b70 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
12b80 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
12b90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
12ba0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
12bb0 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
12bc0 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  pDb->zName)!=0 )
12bd0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e  {.      if( !ifN
12be0 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20  otExist ){.     
12bf0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12c00 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
12c10 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69  x %s already exi
12c20 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  sts", zName);.  
12c30 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
12c40 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12c50 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ex;.    }.  }els
12c60 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  e{.    char zBuf
12c70 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  [30];.    int n;
12c80 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f  .    Index *pLoo
12c90 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  p;.    for(pLoop
12ca0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e  =pTab->pIndex, n
12cb0 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =1; pLoop; pLoop
12cc0 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e  =pLoop->pNext, n
12cd0 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74  ++){}.    sprint
12ce0 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b  f(zBuf,"_%d",n);
12cf0 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a  .    zName = 0;.
12d00 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
12d10 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71  ring(&zName, "sq
12d20 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22  lite_autoindex_"
12d30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
12d40 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Buf, (char*)0);.
12d50 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
12d60 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
12d70 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
12d80 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
12d90 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
12da0 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
12db0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
12dc0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
12dd0 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
12de0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
12df0 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  = pDb->zName;.  
12e00 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
12e10 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
12e20 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
12e30 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
12e40 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
12e50 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
12e60 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
12e70 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43      i = SQLITE_C
12e80 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20  REATE_INDEX;.   
12e90 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
12ea0 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20  B && iDb==1 ) i 
12eb0 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
12ec0 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
12ed0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
12ee0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20  heck(pParse, i, 
12ef0 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
12f00 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
12f10 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
12f20 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
12f30 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
12f40 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
12f50 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
12f60 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
12f70 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
12f80 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
12f90 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
12fa0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
12fb0 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
12fc0 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
12fd0 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
12fe0 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
12ff0 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
13000 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
13010 6e 75 6c 6c 49 64 2e 7a 20 3d 20 28 75 38 2a 29  nullId.z = (u8*)
13020 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
13030 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a  >nCol-1].zName;.
13040 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73      nullId.n = s
13050 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 6e 75 6c  trlen((char*)nul
13060 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73  lId.z);.    pLis
13070 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
13080 69 73 74 41 70 70 65 6e 64 28 30 2c 20 30 2c 20  istAppend(0, 0, 
13090 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66  &nullId);.    if
130a0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
130b0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
130c0 64 65 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  dex;.    pList->
130d0 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
130e0 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a   sortOrder;.  }.
130f0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
13100 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20   how many bytes 
13110 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65 71  of space are req
13120 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65  uired to store e
13130 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73  xplicitly.  ** s
13140 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69  pecified collati
13150 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
13160 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
13170 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
13180 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
13190 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74  r *pExpr = pList
131a0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
131b0 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
131c0 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28       nExtra += (
131d0 31 20 2b 20 73 74 72 6c 65 6e 28 70 45 78 70 72  1 + strlen(pExpr
131e0 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29  ->pColl->zName))
131f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
13200 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
13210 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
13220 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e  ture. .  */.  nN
13230 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61  ame = strlen(zNa
13240 6d 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c  me);.  nCol = pL
13250 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
13260 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ndex = sqliteMal
13270 6c 6f 63 28 20 0a 20 20 20 20 20 20 73 69 7a 65  loc( .      size
13280 6f 66 28 49 6e 64 65 78 29 20 2b 20 20 20 20 20  of(Index) +     
13290 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
132a0 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a  x structure  */.
132b0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74        sizeof(int
132c0 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
132d0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f     /* Index.aiCo
132e0 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20  lumn   */.      
132f0 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 43 6f  sizeof(int)*(nCo
13300 6c 2b 31 29 20 2b 20 20 20 20 20 20 20 2f 2a 20  l+1) +       /* 
13310 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 20 20  Index.aiRowEst  
13320 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
13330 28 63 68 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20  (char *)*nCol + 
13340 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
13350 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20  azColl     */.  
13360 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e      sizeof(u8)*n
13370 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20  Col +           
13380 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f   /* Index.aSortO
13390 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e  rder */.      nN
133a0 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20  ame + 1 +       
133b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
133c0 64 65 78 2e 7a 4e 61 6d 65 20 20 20 20 20 20 2a  dex.zName      *
133d0 2f 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 20  /.      nExtra  
133e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133f0 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f       /* Collatio
13400 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73  n sequence names
13410 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 73   */.  );.  if( s
13420 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
13430 65 64 28 29 20 29 20 67 6f 74 6f 20 65 78 69 74  ed() ) goto exit
13440 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13450 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20   pIndex->azColl 
13460 3d 20 28 63 68 61 72 2a 2a 29 28 26 70 49 6e 64  = (char**)(&pInd
13470 65 78 5b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78  ex[1]);.  pIndex
13480 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e  ->aiColumn = (in
13490 74 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a  t *)(&pIndex->az
134a0 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70  Coll[nCol]);.  p
134b0 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20  Index->aiRowEst 
134c0 3d 20 28 75 6e 73 69 67 6e 65 64 20 2a 29 28 26  = (unsigned *)(&
134d0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
134e0 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65  [nCol]);.  pInde
134f0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  x->aSortOrder = 
13500 28 75 38 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e  (u8 *)(&pIndex->
13510 61 69 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d  aiRowEst[nCol+1]
13520 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  );.  pIndex->zNa
13530 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70  me = (char *)(&p
13540 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
13550 72 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74  r[nCol]);.  zExt
13560 72 61 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70  ra = (char *)(&p
13570 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61  Index->zName[nNa
13580 6d 65 2b 31 5d 29 3b 0a 20 20 73 74 72 63 70 79  me+1]);.  strcpy
13590 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20  (pIndex->zName, 
135a0 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78  zName);.  pIndex
135b0 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b  ->pTable = pTab;
135c0 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  .  pIndex->nColu
135d0 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  mn = pList->nExp
135e0 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  r;.  pIndex->onE
135f0 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  rror = onError;.
13600 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e    pIndex->autoIn
13610 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a  dex = pName==0;.
13620 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d    pIndex->pSchem
13630 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
13640 2e 70 53 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20  .pSchema;..  /* 
13650 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
13660 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20  we should honor 
13670 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e  DESC requests on
13680 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20   index columns. 
13690 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70   */.  if( pDb->p
136a0 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72  Schema->file_for
136b0 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f  mat>=4 ){.    so
136c0 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31  rtOrderMask = -1
136d0 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53  ;   /* Honor DES
136e0 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  C */.  }else{.  
136f0 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
13700 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72  = 0;    /* Ignor
13710 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20  e DESC */.  }.. 
13720 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d   /* Scan the nam
13730 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
13740 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
13750 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64  o be indexed and
13760 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63  .  ** load the c
13770 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e  olumn indices in
13780 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72  to the Index str
13790 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20  ucture.  Report 
137a0 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66  an error.  ** if
137b0 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e   any column is n
137c0 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
137d0 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49   for(i=0, pListI
137e0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
137f0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
13800 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b  +, pListItem++){
13810 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
13820 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73  *zColName = pLis
13830 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  tItem->zName;.  
13840 20 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f    Column *pTabCo
13850 6c 3b 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65  l;.    int reque
13860 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20  stedSortOrder;. 
13870 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20     char *zColl; 
13880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13890 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73    /* Collation s
138a0 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a  equence name */.
138b0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 54  .    for(j=0, pT
138c0 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c  abCol=pTab->aCol
138d0 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
138e0 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b  j++, pTabCol++){
138f0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
13900 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e 61  e3StrICmp(zColNa
13910 6d 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61  me, pTabCol->zNa
13920 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
13930 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e      }.    if( j>
13940 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
13950 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
13960 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
13970 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f  ble %s has no co
13980 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a  lumn named %s",.
13990 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
139a0 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a  ame, zColName);.
139b0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
139c0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
139d0 20 20 7d 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a    }.    /* TODO:
139e0 20 20 41 64 64 20 61 20 74 65 73 74 20 74 6f 20    Add a test to 
139f0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
13a00 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69  he same column i
13a10 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 20 20  s not named.    
13a20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ** more than onc
13a30 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  e within the sam
13a40 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74  e index.  Only t
13a50 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
13a60 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
13a70 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72  column will ever
13a80 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20   be used by the 
13a90 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65  optimizer.  Note
13aa0 20 74 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a   that using the.
13ab0 20 20 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75      ** same colu
13ac0 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  mn more than onc
13ad0 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65  e cannot be an e
13ae0 72 72 6f 72 20 62 65 63 61 75 73 65 20 74 68 61  rror because tha
13af0 74 20 77 6f 75 6c 64 20 0a 20 20 20 20 2a 2a 20  t would .    ** 
13b00 62 72 65 61 6b 20 62 61 63 6b 77 61 72 64 73 20  break backwards 
13b10 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 20  compatibility - 
13b20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  it needs to be a
13b30 20 77 61 72 6e 69 6e 67 2e 0a 20 20 20 20 2a 2f   warning..    */
13b40 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
13b50 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20  olumn[i] = j;.  
13b60 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d    if( pListItem-
13b70 3e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >pExpr ){.      
13b80 61 73 73 65 72 74 28 20 70 4c 69 73 74 49 74 65  assert( pListIte
13b90 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20  m->pExpr->pColl 
13ba0 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  );.      zColl =
13bb0 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20 73   zExtra;.      s
13bc0 74 72 63 70 79 28 7a 45 78 74 72 61 2c 20 70 4c  trcpy(zExtra, pL
13bd0 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
13be0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
13bf0 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 28       zExtra += (
13c00 73 74 72 6c 65 6e 28 7a 43 6f 6c 6c 29 20 2b 20  strlen(zColl) + 
13c10 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
13c20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61       zColl = pTa
13c30 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c  b->aCol[j].zColl
13c40 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f  ;.      if( !zCo
13c50 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  ll ){.        zC
13c60 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
13c70 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
13c80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13c90 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
13ca0 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61   && !sqlite3Loca
13cb0 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
13cc0 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a  , zColl, -1) ){.
13cd0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
13ce0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13cf0 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
13d00 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c  azColl[i] = zCol
13d10 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64  l;.    requested
13d20 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73  SortOrder = pLis
13d30 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  tItem->sortOrder
13d40 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b   & sortOrderMask
13d50 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53  ;.    pIndex->aS
13d60 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 72 65  ortOrder[i] = re
13d70 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
13d80 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
13d90 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e  efaultRowEst(pIn
13da0 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61  dex);..  if( pTa
13db0 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b==pParse->pNewT
13dc0 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  able ){.    /* T
13dd0 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
13de0 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63  been called to c
13df0 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74  reate an automat
13e00 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20  ic index as a.  
13e10 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61    ** result of a
13e20 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
13e30 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e  UNIQUE clause on
13e40 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69   a column defini
13e50 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  tion, or.    ** 
13e60 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
13e70 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66   UNIQUE clause f
13e80 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c  ollowing the col
13e90 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e  umn definitions.
13ea0 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65  .    ** i.e. one
13eb0 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
13ec0 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
13ed0 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  t(x PRIMARY KEY,
13ee0 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41   y);.    ** CREA
13ef0 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c  TE TABLE t(x, y,
13f00 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a   UNIQUE(x, y));.
13f10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69      **.    ** Ei
13f20 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20  ther way, check 
13f30 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61  to see if the ta
13f40 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20  ble already has 
13f50 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49  such an index. I
13f60 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e  f.    ** so, don
13f70 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69  't bother creati
13f80 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69  ng this one. Thi
13f90 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74  s only applies t
13fa0 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74  o.    ** automat
13fb0 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69  ically created i
13fc0 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61  ndices. Users ca
13fd0 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73  n do as they wis
13fe0 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78  h with.    ** ex
13ff0 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a  plicit indices..
14000 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78      */.    Index
14010 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
14020 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
14030 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
14040 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
14050 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61    int k;.      a
14060 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45  ssert( pIdx->onE
14070 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b  rror!=OE_None );
14080 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14090 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29  Idx->autoIndex )
140a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
140b0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
140c0 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20  =OE_None );..   
140d0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f     if( pIdx->nCo
140e0 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43  lumn!=pIndex->nC
140f0 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
14100 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b  ;.      for(k=0;
14110 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   k<pIdx->nColumn
14120 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
14130 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 20 3d  const char *z1 =
14140 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d   pIdx->azColl[k]
14150 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
14160 63 68 61 72 20 2a 7a 32 20 3d 20 70 49 6e 64 65  char *z2 = pInde
14170 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
14180 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
14190 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e  aiColumn[k]!=pIn
141a0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  dex->aiColumn[k]
141b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
141c0 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53 6f 72    if( pIdx->aSor
141d0 74 4f 72 64 65 72 5b 6b 5d 21 3d 70 49 6e 64 65  tOrder[k]!=pInde
141e0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d  x->aSortOrder[k]
141f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
14200 20 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20    if( z1!=z2 && 
14210 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
14220 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a  1, z2) ) break;.
14230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
14240 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  ( k==pIdx->nColu
14250 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  mn ){.        if
14260 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
14270 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  =pIndex->onError
14280 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
14290 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   This constraint
142a0 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d   creates the sam
142b0 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65  e index as a pre
142c0 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20  vious.          
142d0 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70  ** constraint sp
142e0 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72  ecified somewher
142f0 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  e in the CREATE 
14300 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
14310 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f  .          ** Ho
14320 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e  wever the ON CON
14330 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72  FLICT clauses ar
14340 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20  e different. If 
14350 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20  both this .     
14360 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
14370 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69  nt and the previ
14380 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63  ous equivalent c
14390 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65  onstraint have e
143a0 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20  xplicit.        
143b0 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    ** ON CONFLICT
143c0 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73   clauses this is
143d0 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72   an error. Other
143e0 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20  wise, use the.  
143f0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69          ** expli
14400 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
14410 62 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68  behaviour for th
14420 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  e index..       
14430 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
14440 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72  if( !(pIdx->onEr
14450 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
14460 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  || pIndex->onErr
14470 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20  or==OE_Default) 
14480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
14490 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
144a0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
144b0 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63          "conflic
144c0 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  ting ON CONFLICT
144d0 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69   clauses specifi
144e0 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ed", 0);.       
144f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
14500 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
14510 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a  ==OE_Default ){.
14520 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
14530 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64  ->onError = pInd
14540 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  ex->onError;.   
14550 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14560 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
14570 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
14580 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
14590 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
145a0 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
145b0 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
145c0 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
145d0 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65  other.  ** in-me
145e0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
145f0 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a  ructures. .  */.
14600 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
14610 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  usy ){.    Index
14620 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
14630 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
14640 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
14650 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  >idxHash, .     
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14670 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
14680 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78  e, strlen(pIndex
14690 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64  ->zName)+1, pInd
146a0 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  ex);.    if( p )
146b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
146c0 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a  p==pIndex );  /*
146d0 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
146e0 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  e failed */.    
146f0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
14700 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
14710 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
14720 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
14730 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70  anges;.    if( p
14740 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
14750 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
14760 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
14770 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  num;.    }.  }..
14780 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
14790 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74  init.busy is 0 t
147a0 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69  hen create the i
147b0 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54  ndex on disk.  T
147c0 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65  his.  ** involve
147d0 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e  s writing the in
147e0 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73  dex into the mas
147f0 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69  ter table and fi
14800 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a  lling in the.  *
14810 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  * index with the
14820 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63   current table c
14830 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20  ontents..  **.  
14840 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e  ** The db->init.
14850 62 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74  busy is 0 when t
14860 68 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e  he user first en
14870 74 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e  ters a CREATE IN
14880 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e  DEX .  ** comman
14890 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  d.  db->init.bus
148a0 79 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61  y is 1 when a da
148b0 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
148c0 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54   and .  ** CREAT
148d0 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
148e0 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20  ts are read out 
148f0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  of the master ta
14900 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68  ble.  In.  ** th
14910 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68  e latter case th
14920 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
14930 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
14940 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a  which is why.  *
14950 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20  * we don't want 
14960 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a  to recreate it..
14970 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62    **.  ** If pTb
14980 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  lName==0 it mean
14990 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  s this index is 
149a0 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70  generated as a p
149b0 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20  rimary key.  ** 
149c0 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
149d0 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45  aint of a CREATE
149e0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
149f0 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62  .  Since the tab
14a00 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74  le.  ** has just
14a10 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69   been created, i
14a20 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  t contains no da
14a30 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ta and the index
14a40 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
14a50 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65    ** step can be
14a60 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
14a70 20 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e   else if( db->in
14a80 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20  it.busy==0 ){.  
14a90 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
14aa0 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20  har *zStmt;.    
14ab0 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73  int iMem = pPars
14ac0 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20  e->nMem++;..    
14ad0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
14ae0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
14af0 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
14b00 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
14b10 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  x;...    /* Crea
14b20 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  te the rootpage 
14b30 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20  for the index.  
14b40 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
14b50 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
14b60 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
14b70 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
14b80 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14b90 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62  CreateIndex, iDb
14ba0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
14bb0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14bc0 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c  _MemStore, iMem,
14bd0 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74   0);..    /* Gat
14be0 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  her the complete
14bf0 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
14c00 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
14c10 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20  ent into.    ** 
14c20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62  the zStmt variab
14c30 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  le.    */.    if
14c40 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64  ( pStart && pEnd
14c50 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e   ){.      /* A n
14c60 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20  amed index with 
14c70 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41  an explicit CREA
14c80 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
14c90 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d  nt */.      zStm
14ca0 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
14cb0 74 66 28 22 43 52 45 41 54 45 25 73 20 49 4e 44  tf("CREATE%s IND
14cc0 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20  EX %.*s",.      
14cd0 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f    onError==OE_No
14ce0 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51  ne ? "" : " UNIQ
14cf0 55 45 22 2c 0a 20 20 20 20 20 20 20 20 70 45 6e  UE",.        pEn
14d00 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20  d->z - pName->z 
14d10 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61  + 1,.        pNa
14d20 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  me->z);.    }els
14d30 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61  e{.      /* An a
14d40 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63  utomatic index c
14d50 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d  reated by a PRIM
14d60 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
14d70 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  E constraint */.
14d80 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d        /* zStmt =
14d90 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
14da0 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ""); */.      zS
14db0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  tmt = 0;.    }..
14dc0 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e      /* Add an en
14dd0 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61  try in sqlite_ma
14de0 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e  ster for this in
14df0 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
14e00 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
14e10 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
14e20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
14e30 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e  %Q.%s VALUES('in
14e40 64 65 78 27 2c 25 51 2c 25 51 2c 23 30 2c 25 51  dex',%Q,%Q,#0,%Q
14e50 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d  );",.        db-
14e60 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
14e70 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
14e80 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64  b),.        pInd
14e90 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ex->zName,.     
14ea0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
14eb0 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20          zStmt.  
14ec0 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
14ed0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14ee0 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
14ef0 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74  sqliteFree(zStmt
14f00 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20  );..    /* Fill 
14f10 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64  the index with d
14f20 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20  ata and reparse 
14f30 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65  the schema. Code
14f40 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20   an OP_Expire.  
14f50 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61    ** to invalida
14f60 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69  te all pre-compi
14f70 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
14f80 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
14f90 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  TblName ){.     
14fa0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
14fb0 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
14fc0 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ex, iMem);.     
14fd0 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
14fe0 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29  okie(db, v, iDb)
14ff0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15000 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72  dbeOp3(v, OP_Par
15010 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30  seSchema, iDb, 0
15020 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
15030 65 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65 3d  e3MPrintf("name=
15040 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  '%q'", pIndex->z
15050 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49  Name), P3_DYNAMI
15060 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
15070 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15080 5f 45 78 70 69 72 65 2c 20 30 2c 20 30 29 3b 0a  _Expire, 0, 0);.
15090 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
150a0 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69  When adding an i
150b0 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74  ndex to the list
150c0 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20   of indices for 
150d0 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20  a table, make.  
150e0 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69  ** sure all indi
150f0 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52  ces labeled OE_R
15100 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65  eplace come afte
15110 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65  r all those labe
15120 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f  led.  ** OE_Igno
15130 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  re.  This is nec
15140 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63  essary for the c
15150 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
15160 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20   of UPDATE.  ** 
15170 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f  and INSERT..  */
15180 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
15190 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65  busy || pTblName
151a0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ==0 ){.    if( o
151b0 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
151c0 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64  ce || pTab->pInd
151d0 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  ex==0.         |
151e0 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e  | pTab->pIndex->
151f0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
15200 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ace){.      pInd
15210 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62  ex->pNext = pTab
15220 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
15230 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70  pTab->pIndex = p
15240 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65  Index;.    }else
15250 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
15260 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49  Other = pTab->pI
15270 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c  ndex;.      whil
15280 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  e( pOther->pNext
15290 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78   && pOther->pNex
152a0 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  t->onError!=OE_R
152b0 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eplace ){.      
152c0 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65    pOther = pOthe
152d0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
152e0 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  }.      pIndex->
152f0 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e  pNext = pOther->
15300 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74  pNext;.      pOt
15310 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  her->pNext = pIn
15320 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
15330 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Index = 0;.  }..
15340 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65    /* Clean up be
15350 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
15360 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
15370 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  x:.  if( pIndex 
15380 29 7b 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78  ){.    freeIndex
15390 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20  (pIndex);.  }.  
153a0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
153b0 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
153c0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
153d0 6c 65 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a  lete(pTblName);.
153e0 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
153f0 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  me);.  return;.}
15400 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
15410 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65 20 73 75   code to make su
15420 72 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  re the file form
15430 61 74 20 6e 75 6d 62 65 72 20 69 73 20 61 74 20  at number is at 
15440 6c 65 61 73 74 20 6d 69 6e 46 6f 72 6d 61 74 2e  least minFormat.
15450 0a 2a 2a 20 54 68 65 20 67 65 6e 65 72 61 74 65  .** The generate
15460 64 20 63 6f 64 65 20 77 69 6c 6c 20 69 6e 63 72  d code will incr
15470 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 66 6f  ease the file fo
15480 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 66 20 6e  rmat number if n
15490 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 76 6f 69  ecessary..*/.voi
154a0 64 20 73 71 6c 69 74 65 33 4d 69 6e 69 6d 75 6d  d sqlite3Minimum
154b0 46 69 6c 65 46 6f 72 6d 61 74 28 50 61 72 73 65  FileFormat(Parse
154c0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
154d0 62 2c 20 69 6e 74 20 6d 69 6e 46 6f 72 6d 61 74  b, int minFormat
154e0 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
154f0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
15500 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
15510 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
15520 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
15530 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44  P_ReadCookie, iD
15540 62 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 1);.    sqlit
15550 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
15560 50 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e 46 6f  P_Integer, minFo
15570 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  rmat, 0);.    sq
15580 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
15590 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 73 71 6c 69  , OP_Ge, 0, sqli
155a0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
155b0 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 73 71  dr(v)+3);.    sq
155c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
155d0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 69  , OP_Integer, mi
155e0 6e 46 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20  nFormat, 0);.   
155f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15600 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
15610 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 7d 0a  e, iDb, 1);.  }.
15620 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68  }../*.** Fill th
15630 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74  e Index.aiRowEst
15640 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65  [] array with de
15650 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f  fault informatio
15660 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  n - information.
15670 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68  ** to be used wh
15680 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72  en we have not r
15690 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63  un the ANALYZE c
156a0 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69  ommand..**.** ai
156b0 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70  RowEst[0] is sup
156c0 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  pose to contain 
156d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
156e0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  ements in the in
156f0 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65  dex..** Since we
15700 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75   do not know, gu
15710 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20  ess 1 million.  
15720 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61  aiRowEst[1] is a
15730 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
15740 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
15750 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
15760 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
15770 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65  particular value
15780 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   of the.** first
15790 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
157a0 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b  ndex.  aiRowEst[
157b0 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  2] is an estimat
157c0 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a  e of the number.
157d0 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  ** of rows that 
157e0 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
157f0 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f  ular combiniatio
15800 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32  n of the first 2
15810 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74   columns.** of t
15820 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73  he index.  And s
15830 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73  o forth.  It mus
15840 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  t always be the 
15850 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20  case that.*.**  
15860 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
15870 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e  t[N]<=aiRowEst[N
15880 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  -1].**          
15890 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a   aiRowEst[N]>=1.
158a0 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d  **.** Apart from
158b0 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c   that, we have l
158c0 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62  ittle to go on b
158d0 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e  esides intuition
158e0 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69   as to.** how ai
158f0 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20  RowEst[] should 
15900 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
15910 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e   The numbers gen
15920 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61  erated here.** a
15930 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69  re based on typi
15940 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64  cal values found
15950 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63   in actual indic
15960 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
15970 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
15980 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
15990 20 75 6e 73 69 67 6e 65 64 20 2a 61 20 3d 20 70   unsigned *a = p
159a0 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20  Idx->aiRowEst;. 
159b0 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
159c0 28 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d  ( a!=0 );.  a[0]
159d0 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 66 6f   = 1000000;.  fo
159e0 72 28 69 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  r(i=pIdx->nColum
159f0 6e 3b 20 69 3e 3d 35 3b 20 69 2d 2d 29 7b 0a 20  n; i>=5; i--){. 
15a00 20 20 20 61 5b 69 5d 20 3d 20 35 3b 0a 20 20 7d     a[i] = 5;.  }
15a10 0a 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 29  .  while( i>=1 )
15a20 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 31 31 20  {.    a[i] = 11 
15a30 2d 20 69 3b 0a 20 20 20 20 69 2d 2d 3b 0a 20 20  - i;.    i--;.  
15a40 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e  }.  if( pIdx->on
15a50 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
15a60 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43  {.    a[pIdx->nC
15a70 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a  olumn] = 1;.  }.
15a80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
15a90 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20  utine will drop 
15aa0 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65  an existing name
15ab0 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72  d index.  This r
15ac0 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d  outine.** implem
15ad0 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e  ents the DROP IN
15ae0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  DEX statement..*
15af0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
15b00 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  opIndex(Parse *p
15b10 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
15b20 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69  pName, int ifExi
15b30 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  sts){.  Index *p
15b40 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76  Index;.  Vdbe *v
15b50 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
15b60 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
15b70 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20  int iDb;..  if( 
15b80 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
15b90 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
15ba0 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 67 6f 74  led() ){.    got
15bb0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
15bc0 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
15bd0 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
15be0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
15bf0 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
15c00 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
15c10 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
15c20 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
15c30 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
15c40 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70  3FindIndex(db, p
15c50 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
15c60 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
15c70 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20  atabase);.  if( 
15c80 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20  pIndex==0 ){.   
15c90 20 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29   if( !ifExists )
15ca0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
15cb0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15cc0 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
15cd0 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  %S", pName, 0);.
15ce0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
15cf0 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
15d00 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  1;.    goto exit
15d10 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
15d20 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61  .  if( pIndex->a
15d30 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  utoIndex ){.    
15d40 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15d50 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61  pParse, "index a
15d60 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55  ssociated with U
15d70 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f  NIQUE ".      "o
15d80 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
15d90 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
15da0 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
15db0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
15dc0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
15dd0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
15de0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
15df0 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
15e00 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
15e10 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
15e20 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
15e30 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
15e40 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61  OP_INDEX;.    Ta
15e50 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
15e60 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  ex->pTable;.    
15e70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
15e80 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
15e90 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
15ea0 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
15eb0 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a  EMA_TABLE(iDb);.
15ec0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
15ed0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
15ee0 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
15ef0 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b  zTab, 0, zDb) ){
15f00 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
15f10 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
15f20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54   }.    if( !OMIT
15f30 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29  _TEMPDB && iDb )
15f40 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
15f50 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ROP_TEMP_INDEX;.
15f60 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
15f70 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
15f80 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a   code, pIndex->z
15f90 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
15fa0 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
15fb0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
15fc0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
15fd0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
15fe0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
15ff0 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
16000 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  and from the mas
16010 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76  ter table */.  v
16020 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
16030 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
16040 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
16050 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
16060 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c  rse,.       "DEL
16070 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
16080 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
16090 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
160a0 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
160b0 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
160c0 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
160d0 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  e.    );.    sql
160e0 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
160f0 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20  (db, v, iDb);.  
16100 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
16110 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  e(pParse, pIndex
16120 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
16130 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
16140 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78  (v, OP_DropIndex
16150 2c 20 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78  , iDb, 0, pIndex
16160 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
16170 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  ..exit_drop_inde
16180 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  x:.  sqlite3SrcL
16190 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29  istDelete(pName)
161a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 70 41 72 72  ;.}../*.** ppArr
161b0 61 79 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 61  ay points into a
161c0 20 73 74 72 75 63 74 75 72 65 20 77 68 65 72 65   structure where
161d0 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 72 72   there is an arr
161e0 61 79 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 66 6f  ay pointer.** fo
161f0 6c 6c 6f 77 65 64 20 62 79 20 74 77 6f 20 69 6e  llowed by two in
16200 74 65 67 65 72 73 2e 20 54 68 65 20 66 69 72 73  tegers. The firs
16210 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 68 65  t integer is the
16220 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  .** number of el
16230 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 73 74  ements in the st
16240 72 75 63 74 75 72 65 20 61 72 72 61 79 2e 20 20  ructure array.  
16250 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67  The second integ
16260 65 72 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d  er.** is the num
16270 62 65 72 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  ber of allocated
16280 20 73 6c 6f 74 73 20 69 6e 20 74 68 65 20 61 72   slots in the ar
16290 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  ray..**.** In ot
162a0 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 73  her words, the s
162b0 74 72 75 63 74 75 72 65 20 6c 6f 6f 6b 73 20 73  tructure looks s
162c0 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68  omething like th
162d0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
162e0 20 73 74 72 75 63 74 20 45 78 61 6d 70 6c 65 31   struct Example1
162f0 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73   {.**          s
16300 74 72 75 63 74 20 73 75 62 45 6c 65 6d 20 2a 61  truct subElem *a
16310 45 6e 74 72 79 3b 0a 2a 2a 20 20 20 20 20 20 20  Entry;.**       
16320 20 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 0a 2a     int nEntry;.*
16330 2a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  *          int n
16340 41 6c 6c 6f 63 3b 0a 2a 2a 20 20 20 20 20 20 20  Alloc;.**       
16350 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6e 45   }.**.** The pnE
16360 6e 74 72 79 20 70 61 72 61 6d 65 74 65 72 20 70  ntry parameter p
16370 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 71 75  oints to the equ
16380 69 76 61 6c 65 6e 74 20 6f 66 20 45 78 61 6d 70  ivalent of Examp
16390 6c 65 31 2e 6e 45 6e 74 72 79 2e 0a 2a 2a 0a 2a  le1.nEntry..**.*
163a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
163b0 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 20 73  llocates a new s
163c0 6c 6f 74 20 69 6e 20 74 68 65 20 61 72 72 61 79  lot in the array
163d0 2c 20 7a 65 72 6f 73 20 69 74 20 6f 75 74 2c 0a  , zeros it out,.
163e0 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20 69  ** and returns i
163f0 74 73 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 61  ts index.  If ma
16400 6c 6c 6f 63 20 66 61 69 6c 73 20 61 20 6e 65 67  lloc fails a neg
16410 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 73 20  ative number is 
16420 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
16430 73 7a 45 6e 74 72 79 20 69 73 20 74 68 65 20 73  szEntry is the s
16440 69 7a 65 6f 66 20 6f 66 20 61 20 73 69 6e 67 6c  izeof of a singl
16450 65 20 61 72 72 61 79 20 65 6e 74 72 79 2e 20 20  e array entry.  
16460 69 6e 69 74 53 69 7a 65 20 69 73 20 74 68 65 20  initSize is the 
16470 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  .** number of ar
16480 72 61 79 20 65 6e 74 72 69 65 73 20 61 6c 6c 6f  ray entries allo
16490 63 61 74 65 64 20 6f 6e 20 74 68 65 20 69 6e 69  cated on the ini
164a0 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  tial allocation.
164b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 41  .*/.int sqlite3A
164c0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 76 6f 69  rrayAllocate(voi
164d0 64 20 2a 2a 70 70 41 72 72 61 79 2c 20 69 6e 74  d **ppArray, int
164e0 20 73 7a 45 6e 74 72 79 2c 20 69 6e 74 20 69 6e   szEntry, int in
164f0 69 74 53 69 7a 65 29 7b 0a 20 20 63 68 61 72 20  itSize){.  char 
16500 2a 70 3b 0a 20 20 69 6e 74 20 2a 61 6e 20 3d 20  *p;.  int *an = 
16510 28 69 6e 74 2a 29 26 70 70 41 72 72 61 79 5b 31  (int*)&ppArray[1
16520 5d 3b 0a 20 20 69 66 28 20 61 6e 5b 30 5d 3e 3d  ];.  if( an[0]>=
16530 61 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 76 6f 69  an[1] ){.    voi
16540 64 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74  d *pNew;.    int
16550 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65   newSize;.    ne
16560 77 53 69 7a 65 20 3d 20 61 6e 5b 31 5d 2a 32 20  wSize = an[1]*2 
16570 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20  + initSize;.    
16580 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61  pNew = sqliteRea
16590 6c 6c 6f 63 28 2a 70 70 41 72 72 61 79 2c 20 6e  lloc(*ppArray, n
165a0 65 77 53 69 7a 65 2a 73 7a 45 6e 74 72 79 29 3b  ewSize*szEntry);
165b0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
165c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
165d0 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   -1;.    }.    a
165e0 6e 5b 31 5d 20 3d 20 6e 65 77 53 69 7a 65 3b 0a  n[1] = newSize;.
165f0 20 20 20 20 2a 70 70 41 72 72 61 79 20 3d 20 70      *ppArray = p
16600 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 2a  New;.  }.  p = *
16610 70 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65  ppArray;.  memse
16620 74 28 26 70 5b 61 6e 5b 30 5d 2a 73 7a 45 6e 74  t(&p[an[0]*szEnt
16630 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29  ry], 0, szEntry)
16640 3b 0a 20 20 72 65 74 75 72 6e 20 61 6e 5b 30 5d  ;.  return an[0]
16650 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ++;.}../*.** App
16660 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  end a new elemen
16670 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49  t to the given I
16680 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  dList.  Create a
16690 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a   new IdList if.*
166a0 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a  * need be..**.**
166b0 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73   A new IdList is
166c0 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
166d0 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
166e0 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20  ails..*/.IdList 
166f0 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70  *sqlite3IdListAp
16700 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69  pend(IdList *pLi
16710 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
16720 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  n){.  int i;.  i
16730 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
16740 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
16750 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
16760 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
16770 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
16780 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
16790 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20  t->nAlloc = 0;. 
167a0 20 7d 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33   }.  i = sqlite3
167b0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 28 76  ArrayAllocate((v
167c0 6f 69 64 2a 2a 29 26 70 4c 69 73 74 2d 3e 61 2c  oid**)&pList->a,
167d0 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
167e0 5b 30 5d 29 2c 20 35 29 3b 0a 20 20 69 66 28 20  [0]), 5);.  if( 
167f0 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  i<0 ){.    sqlit
16800 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  e3IdListDelete(p
16810 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72  List);.    retur
16820 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
16830 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
16840 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
16850 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 72  ken(pToken);.  r
16860 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
16870 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
16880 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
16890 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
168a0 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  ete(IdList *pLis
168b0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
168c0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
168d0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
168e0 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
168f0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
16900 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
16910 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
16920 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
16930 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
16940 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
16950 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
16960 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
16970 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
16980 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
16990 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
169a0 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
169b0 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
169c0 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
169d0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
169e0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
169f0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
16a00 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
16a10 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
16a20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
16a30 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
16a40 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
16a50 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
16a60 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
16a70 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
16a80 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62  Append a new tab
16a90 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67  le name to the g
16aa0 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43  iven SrcList.  C
16ab0 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c  reate a new SrcL
16ac0 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
16ad0 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  e.  A new entry 
16ae0 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  is created in th
16af0 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69  e SrcList even i
16b00 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
16b10 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72  ..**.** A new Sr
16b20 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  cList is returne
16b30 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
16b40 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a  lloc() fails..**
16b50 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65  .** If pDatabase
16b60 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74   is not null, it
16b70 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
16b80 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74  table has an opt
16b90 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ional.** databas
16ba0 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20  e name prefix.  
16bb0 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74  Like this:  "dat
16bc0 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54  abase.table".  T
16bd0 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  he pDatabase.** 
16be0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61  points to the ta
16bf0 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
16c00 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74   pTable points t
16c10 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  o the database n
16c20 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c  ame..** The SrcL
16c30 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69  ist.a[].zName fi
16c40 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69  eld is filled wi
16c50 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  th the table nam
16c60 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a  e which might.**
16c70 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   come from pTabl
16c80 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20  e (if pDatabase 
16c90 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d  is NULL) or from
16ca0 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a   pDatabase.  .**
16cb0 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61   SrcList.a[].zDa
16cc0 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64  tabase is filled
16cd0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
16ce0 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61  se name from pTa
16cf0 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20  ble,.** or with 
16d00 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62  NULL if no datab
16d10 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ase is specified
16d20 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
16d30 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20   words, if call 
16d40 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
16d50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16d60 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c  SrcListAppend(A,
16d70 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,0);.**.** Then
16d80 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61   B is a table na
16d90 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  me and the datab
16da0 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70  ase name is unsp
16db0 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c  ecified.  If cal
16dc0 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73  led.** like this
16dd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
16de0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
16df0 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a  pend(A,B,C);.**.
16e00 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65  ** Then C is the
16e10 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
16e20 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73  B is the databas
16e30 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69  e name..*/.SrcLi
16e40 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
16e50 73 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74  stAppend(SrcList
16e60 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
16e70 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70  pTable, Token *p
16e80 44 61 74 61 62 61 73 65 29 7b 0a 20 20 73 74 72  Database){.  str
16e90 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
16ea0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
16eb0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
16ec0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
16ed0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63 4c  loc( sizeof(SrcL
16ee0 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
16ef0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
16f00 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  n 0;.    pList->
16f10 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a  nAlloc = 1;.  }.
16f20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72    if( pList->nSr
16f30 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  c>=pList->nAlloc
16f40 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
16f50 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73 74  *pNew;.    pList
16f60 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20  ->nAlloc *= 2;. 
16f70 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
16f80 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20  Realloc(pList,. 
16f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
16fa0 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28  zeof(*pList) + (
16fb0 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29  pList->nAlloc-1)
16fc0 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
16fd0 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
16fe0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
16ff0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
17000 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
17010 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
17020 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20    }.    pList = 
17030 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65  pNew;.  }.  pIte
17040 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
17050 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d 65  ist->nSrc];.  me
17060 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73  mset(pItem, 0, s
17070 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
17080 5d 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61  ]));.  if( pData
17090 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73  base && pDatabas
170a0 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  e->z==0 ){.    p
170b0 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
170c0 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
170d0 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20  e && pTable ){. 
170e0 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20     Token *pTemp 
170f0 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20  = pDatabase;.   
17100 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61   pDatabase = pTa
17110 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20  ble;.    pTable 
17120 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70  = pTemp;.  }.  p
17130 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
17140 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
17150 65 6e 28 70 54 61 62 6c 65 29 3b 0a 20 20 70 49  en(pTable);.  pI
17160 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
17170 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
17180 54 6f 6b 65 6e 28 70 44 61 74 61 62 61 73 65 29  Token(pDatabase)
17190 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  ;.  pItem->iCurs
171a0 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 49 74 65 6d  or = -1;.  pItem
171b0 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20  ->isPopulated = 
171c0 30 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63  0;.  pList->nSrc
171d0 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  ++;.  return pLi
171e0 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  st;.}../*.** Ass
171f0 69 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20 61  ign cursors to a
17200 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53  ll tables in a S
17210 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
17220 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
17230 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65  ignCursors(Parse
17240 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
17250 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
17260 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
17270 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
17280 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73 74  ;.  assert(pList
17290 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   || sqlite3Mallo
172a0 63 46 61 69 6c 65 64 28 29 20 29 3b 0a 20 20 69  cFailed() );.  i
172b0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
172c0 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
172d0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
172e0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
172f0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
17300 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e   pItem->iCursor>
17310 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
17320 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
17330 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
17340 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  +;.      if( pIt
17350 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
17360 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
17370 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
17380 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  rs(pParse, pItem
17390 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29  ->pSelect->pSrc)
173a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
173b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
173c0 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
173d0 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
173e0 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
173f0 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
17400 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
17410 74 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  te(SrcList *pLis
17420 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
17430 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
17440 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
17450 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
17460 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  rn;.  for(pItem=
17470 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
17480 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
17490 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
174a0 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65   sqliteFree(pIte
174b0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
174c0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
174d0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
174e0 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65   sqliteFree(pIte
174f0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
17500 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
17510 6c 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54 61  le(0, pItem->pTa
17520 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  b);.    sqlite3S
17530 65 6c 65 63 74 44 65 6c 65 74 65 28 70 49 74 65  electDelete(pIte
17540 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
17550 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
17560 74 65 28 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a  te(pItem->pOn);.
17570 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
17580 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  tDelete(pItem->p
17590 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71  Using);.  }.  sq
175a0 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b  liteFree(pList);
175b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
175c0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
175d0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74   by the parser t
175e0 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d  o add a new term
175f0 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
17600 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d  f a growing FROM
17610 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70   clause.  The "p
17620 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  " parameter is t
17630 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  he part of.** th
17640 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68  e FROM clause th
17650 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
17660 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  een constructed.
17670 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a    "p" is NULL.**
17680 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
17690 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68  first term of th
176a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
176b0 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61  pTable and pData
176c0 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  base.** are the 
176d0 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
176e0 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e  e and database n
176f0 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
17700 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a   clause term..**
17710 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
17720 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  LL if the databa
17730 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65  se name qualifie
17740 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74  r is missing - t
17750 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65  he.** usual case
17760 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68  .  If the term h
17770 61 73 20 61 20 61 6c 69 61 73 2c 20 74 68 65 6e  as a alias, then
17780 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74   pAlias points t
17790 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74  o the.** alias t
177a0 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65  oken.  If the te
177b0 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  rm is a subquery
177c0 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79  , then pSubquery
177d0 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   is the.** SELEC
177e0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
177f0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e   the subquery en
17800 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62  codes.  The pTab
17810 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62  le and.** pDatab
17820 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61  ase parameters a
17830 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71  re NULL for subq
17840 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e  ueries.  The pOn
17850 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70   and pUsing.** p
17860 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68  arameters are th
17870 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
17880 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
17890 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  auses..**.** Ret
178a0 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73  urn a new SrcLis
178b0 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20  t which encodes 
178c0 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68  is the FROM with
178d0 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d   the new.** term
178e0 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69   added..*/.SrcLi
178f0 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
17900 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
17910 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  (.  SrcList *p, 
17920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17930 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20  he left part of 
17940 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
17950 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a  already seen */.
17960 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
17970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
17980 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
17990 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f  o add to the FRO
179a0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f  M clause */.  To
179b0 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20  ken *pDatabase, 
179c0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
179d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
179e0 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20  ntaining pTable 
179f0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69  */.  Token *pAli
17a00 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  as,          /* 
17a10 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
17a20 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75  ide of the AS su
17a30 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
17a40 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65   Select *pSubque
17a50 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75  ry,      /* A su
17a60 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70  bquery used in p
17a70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20  lace of a table 
17a80 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
17a90 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pOn,            
17aa0 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75    /* The ON clau
17ab0 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a  se of a join */.
17ac0 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67    IdList *pUsing
17ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17ae0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
17af0 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20   a join */.){.  
17b00 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
17b10 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 70 20  tem *pItem;.  p 
17b20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
17b30 41 70 70 65 6e 64 28 70 2c 20 70 54 61 62 6c 65  Append(p, pTable
17b40 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
17b50 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e  if( p==0 || p->n
17b60 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Src==0 ){.    sq
17b70 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
17b80 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
17b90 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 55  3IdListDelete(pU
17ba0 73 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  sing);.    sqlit
17bb0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
17bc0 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 72  Subquery);.    r
17bd0 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 20 20 70  eturn p;.  }.  p
17be0 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
17bf0 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70  nSrc-1];.  if( p
17c00 41 6c 69 61 73 20 26 26 20 70 41 6c 69 61 73 2d  Alias && pAlias-
17c10 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d  >n ){.    pItem-
17c20 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
17c30 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
17c40 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49  Alias);.  }.  pI
17c50 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70  tem->pSelect = p
17c60 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65  Subquery;.  pIte
17c70 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20  m->pOn = pOn;.  
17c80 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  pItem->pUsing = 
17c90 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e  pUsing;.  return
17ca0 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65   p;.}../*.** Whe
17cb0 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20  n building up a 
17cc0 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
17cd0 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a  he parser, the j
17ce0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  oin operator.** 
17cf0 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74  is initially att
17d00 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
17d10 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20  t operand.  But 
17d20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
17d30 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68  or.** expects th
17d40 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
17d50 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67  to be on the rig
17d60 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  ht operand.  Thi
17d70 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69  s routine.** Shi
17d80 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65  fts all join ope
17d90 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74  rators from left
17da0 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e   to right for an
17db0 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20   entire FROM.** 
17dc0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  clause..**.** Ex
17dd0 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74  ample: Suppose t
17de0 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20  he join is like 
17df0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
17e00 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20        A natural 
17e10 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a  cross join B.**.
17e20 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  ** The operator 
17e30 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73  is "natural cros
17e40 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20  s join".  The A 
17e50 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61  and B operands a
17e60 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  re stored.** in 
17e70 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61  p->a[0] and p->a
17e80 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c  [1], respectivel
17e90 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  y.  The parser i
17ea0 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20  nitially stores 
17eb0 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  the.** operator 
17ec0 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f  with A.  This ro
17ed0 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61  utine shifts tha
17ee0 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20  t operator over 
17ef0 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  to B..*/.void sq
17f00 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66  lite3SrcListShif
17f10 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73  tJoinType(SrcLis
17f20 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 26  t *p){.  if( p &
17f30 26 20 70 2d 3e 61 20 29 7b 0a 20 20 20 20 69 6e  & p->a ){.    in
17f40 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
17f50 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69  ->nSrc-1; i>0; i
17f60 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  --){.      p->a[
17f70 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d  i].jointype = p-
17f80 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  >a[i-1].jointype
17f90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
17fa0 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30  [0].jointype = 0
17fb0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ;.  }.}../*.** B
17fc0 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
17fd0 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
17fe0 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e3BeginTransacti
17ff0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
18000 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73  , int type){.  s
18010 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
18020 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a  be *v;.  int i;.
18030 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
18040 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
18050 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
18060 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
18070 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
18080 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
18090 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
180a0 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  ) ) return;.  if
180b0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
180c0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
180d0 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
180e0 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20  BEGIN", 0, 0) ) 
180f0 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
18100 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
18110 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20  arse);.  if( !v 
18120 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
18130 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45  type!=TK_DEFERRE
18140 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  D ){.    for(i=0
18150 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
18160 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18170 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
18180 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20  Transaction, i, 
18190 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53  (type==TK_EXCLUS
181a0 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  IVE)+1);.    }. 
181b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
181c0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f  AddOp(v, OP_Auto
181d0 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d  Commit, 0, 0);.}
181e0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
181f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
18200 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
18210 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
18220 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
18230 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
18240 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70  dbe *v;..  if( p
18250 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
18260 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
18270 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
18280 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
18290 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
182a0 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   || sqlite3Mallo
182b0 63 46 61 69 6c 65 64 28 29 20 29 20 72 65 74 75  cFailed() ) retu
182c0 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
182d0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
182e0 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
182f0 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c  CTION, "COMMIT",
18300 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
18310 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
18320 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
18330 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
18340 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
18350 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
18360 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 0);.  }.}..
18370 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
18380 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
18390 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
183a0 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
183b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
183c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
183d0 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
183e0 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
183f0 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
18400 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
18410 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
18420 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
18430 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c  rr || sqlite3Mal
18440 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20 72 65  locFailed() ) re
18450 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
18460 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
18470 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
18480 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
18490 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  CK", 0, 0) ) ret
184a0 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
184b0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
184c0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
184d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
184e0 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  dOp(v, OP_AutoCo
184f0 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d  mmit, 1, 1);.  }
18500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
18510 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74  ure the TEMP dat
18520 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e  abase is open an
18530 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
18540 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
18550 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
18560 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79  rors.  Leave any
18570 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
18580 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
18590 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
185a0 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
185b0 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70  atabase(Parse *p
185c0 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
185d0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
185e0 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44  db;.  if( db->aD
185f0 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21  b[1].pBt==0 && !
18600 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
18610 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
18620 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74  sqlite3BtreeFact
18630 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d 41  ory(db, 0, 0, MA
18640 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61 44  X_PAGES, &db->aD
18650 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69  b[1].pBt);.    i
18660 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18670 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18680 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18690 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
186a0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61  n a temporary da
186b0 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20  tabase ".       
186c0 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69   "file for stori
186d0 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
186e0 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61  les");.      pPa
186f0 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
18700 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
18710 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
18720 66 6c 61 67 73 20 26 20 21 64 62 2d 3e 61 75 74  flags & !db->aut
18730 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  oCommit ){.     
18740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
18750 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d  eeBeginTrans(db-
18760 3e 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31 29 3b  >aDb[1].pBt, 1);
18770 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
18780 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18790 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
187a0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
187b0 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69  ble to get a wri
187c0 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20  te lock on ".   
187d0 20 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70         "the temp
187e0 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66  orary database f
187f0 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ile");.        p
18800 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
18810 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
18820 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18830 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
18840 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
18850 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
18860 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
18870 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
18880 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74  at will verify t
18890 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
188a0 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20   and start.** a 
188b0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
188c0 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64   for all named d
188d0 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a  atabase files..*
188e0 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72  *.** It is impor
188f0 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63  tant that all sc
18900 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20  hema cookies be 
18910 76 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c  verified and all
18920 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63  .** read transac
18930 74 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64  tions be started
18940 20 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67   before anything
18950 20 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e   else happens in
18960 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f  .** the VDBE pro
18970 67 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20  gram.  But this 
18980 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63  routine can be c
18990 61 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68  alled after much
189a0 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68   other.** code h
189b0 61 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65  as been generate
189c0 64 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20 77  d.  So here is w
189d0 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a  hat we do:.**.**
189e0 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
189f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
18a00 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20  called, we code 
18a10 61 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a  an OP_Goto that.
18a20 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20  ** will jump to 
18a30 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20  a subroutine at 
18a40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
18a50 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65  rogram.  Then we
18a60 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79  .** record every
18a70 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 6e   database that n
18a80 65 65 64 73 20 69 74 73 20 73 63 68 65 6d 61 20  eeds its schema 
18a90 76 65 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a  verified in the.
18aa0 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ** pParse->cooki
18ab0 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61  eMask field.  La
18ac0 74 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f  ter, after all o
18ad0 74 68 65 72 20 63 6f 64 65 20 68 61 73 20 62 65  ther code has be
18ae0 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c  en.** generated,
18af0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
18b00 74 68 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f  that does the co
18b10 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f  okie verificatio
18b20 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73  ns and.** starts
18b30 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18b40 73 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20  s will be coded 
18b50 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20  and the OP_Goto 
18b60 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c  P2 value.** will
18b70 20 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e   be made to poin
18b80 74 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75  t to that subrou
18b90 74 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72  tine.  The gener
18ba0 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
18bb0 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74  cookie verificat
18bc0 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ion subroutine c
18bd0 6f 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73  ode happens in s
18be0 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
18bf0 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  ng()..**.** If i
18c00 44 62 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74  Db<0 then code t
18c10 68 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20  he OP_Goto only 
18c20 2d 20 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67  - don't set flag
18c30 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a   to verify the.*
18c40 2a 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20  * schema on any 
18c50 64 61 74 61 62 61 73 65 73 2e 20 20 54 68 69 73  databases.  This
18c60 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
18c70 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f  position the OP_
18c80 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e  Goto.** early in
18c90 20 74 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72   the code, befor
18ca0 65 20 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79  e we know if any
18cb0 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73   database tables
18cc0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a   will be used..*
18cd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
18ce0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
18cf0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
18d00 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
18d10 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
18d20 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20  ;.  int mask;.. 
18d30 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
18d40 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
18d50 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
18d60 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20  ;  /* This only 
18d70 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 72 65  happens if there
18d80 20 77 61 73 20 61 20 70 72 69 6f 72 20 65 72 72   was a prior err
18d90 6f 72 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  or */.  db = pPa
18da0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
18db0 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
18dc0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72  o==0 ){.    pPar
18dd0 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d  se->cookieGoto =
18de0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18df0 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
18e00 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28   0)+1;.  }.  if(
18e10 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61   iDb>=0 ){.    a
18e20 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e  ssert( iDb<db->n
18e30 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Db );.    assert
18e40 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
18e50 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20  Bt!=0 || iDb==1 
18e60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
18e70 44 62 3c 4d 41 58 5f 41 54 54 41 43 48 45 44 2b  Db<MAX_ATTACHED+
18e80 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20  2 );.    mask = 
18e90 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20  1<<iDb;.    if( 
18ea0 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d  (pParse->cookieM
18eb0 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
18ec0 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
18ed0 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61  cookieMask |= ma
18ee0 73 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  sk;.      pParse
18ef0 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44  ->cookieValue[iD
18f00 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  b] = db->aDb[iDb
18f10 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ].pSchema->schem
18f20 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20  a_cookie;.      
18f30 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
18f40 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
18f50 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
18f60 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50  nTempDatabase(pP
18f70 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
18f80 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
18f90 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
18fa0 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72  code that prepar
18fb0 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20  es for doing an 
18fc0 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a  operation that.*
18fd0 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  * might change t
18fe0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
18ff0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19000 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61  starts a new tra
19010 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61  nsaction if we a
19020 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77  re not already w
19030 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73  ithin.** a trans
19040 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61  action.  If we a
19050 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  re already withi
19060 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
19070 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69   then a checkpoi
19080 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20  nt.** is set if 
19090 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74  the setStatement
190a0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
190b0 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e  ue.  A checkpoin
190c0 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
190d0 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e  et for operation
190e0 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69  s that might fai
190f0 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73  l (due to a cons
19100 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a  traint) part of.
19110 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75  ** the way throu
19120 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c  gh and which wil
19130 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73  l need to undo s
19140 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f  ome writes witho
19150 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20  ut having to.** 
19160 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f  rollback the who
19170 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  le transaction. 
19180 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   For operations 
19190 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72  where all constr
191a0 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20  aints.** can be 
191b0 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61  checked before a
191c0 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  ny changes are m
191d0 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
191e0 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72  ase, it is never
191f0 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  .** necessary to
19200 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e   undo a write an
19210 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  d the checkpoint
19220 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73   should not be s
19230 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64  et..**.** Only d
19240 61 74 61 62 61 73 65 20 69 44 62 20 61 6e 64 20  atabase iDb and 
19250 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
19260 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
19270 62 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c  ble by this call
19280 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20  ..** If iDb==0, 
19290 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e  then the main an
192a0 64 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 73  d temp databases
192b0 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
192c0 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d  le.   If.** iDb=
192d0 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =1 then only the
192e0 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 69   temp database i
192f0 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  s made writable.
19300 20 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20    If iDb>1 then 
19310 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  the.** specified
19320 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
19330 61 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70  ase and the temp
19340 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
19350 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  de writable..*/.
19360 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
19370 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
19380 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
19390 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c  nt setStatement,
193a0 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
193b0 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
193c0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
193d0 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
193e0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64  rn;.  sqlite3Cod
193f0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
19400 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50  arse, iDb);.  pP
19410 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20  arse->writeMask 
19420 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28  |= 1<<iDb;.  if(
19430 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26 26   setStatement &&
19440 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
19450 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
19460 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
19470 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c  _Statement, iDb,
19480 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28   0);.  }.  if( (
19490 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69  OMIT_TEMPDB || i
194a0 44 62 21 3d 31 29 20 26 26 20 70 50 61 72 73 65  Db!=1) && pParse
194b0 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ->db->aDb[1].pBt
194c0 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
194d0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
194e0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65  ation(pParse, se
194f0 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a  tStatement, 1);.
19500 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65    }.}../*.** Che
19510 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e  ck to see if pIn
19520 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c  dex uses the col
19530 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
19540 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a  pColl.  Return.*
19550 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  * true if it doe
19560 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69  s and false if i
19570 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23  t does not..*/.#
19580 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19590 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
195a0 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d  c int collationM
195b0 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20  atch(const char 
195c0 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70  *zColl, Index *p
195d0 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b  Index){.  int i;
195e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
195f0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  ndex->nColumn; i
19600 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
19610 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d  har *z = pIndex-
19620 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
19630 69 66 28 20 7a 3d 3d 7a 43 6f 6c 6c 20 7c 7c 20  if( z==zColl || 
19640 28 7a 20 26 26 20 7a 43 6f 6c 6c 20 26 26 20 30  (z && zColl && 0
19650 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
19660 28 7a 2c 20 7a 43 6f 6c 6c 29 29 20 29 7b 0a 20  (z, zColl)) ){. 
19670 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
19680 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
19690 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 0;.}.#endif../
196a0 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
196b0 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
196c0 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ab that use the 
196d0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
196e0 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20  ce pColl..** If 
196f0 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
19700 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
19710 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a  ces of pTab..*/.
19720 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19730 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
19740 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54  ic void reindexT
19750 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
19760 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  se, Table *pTab,
19770 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
19780 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ll){.  Index *pI
19790 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
197a0 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
197b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
197c0 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49  Tab */..  for(pI
197d0 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  ndex=pTab->pInde
197e0 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
197f0 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29  x=pIndex->pNext)
19800 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d  {.    if( zColl=
19810 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d  =0 || collationM
19820 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64  atch(zColl, pInd
19830 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ex) ){.      int
19840 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
19850 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
19860 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
19870 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71  chema);.      sq
19880 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
19890 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
198a0 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20   0, iDb);.      
198b0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
198c0 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
198d0 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  x, -1);.    }.  
198e0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
198f0 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
19900 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74  indices of all t
19910 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  ables in all dat
19920 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65  abases where the
19930 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20  .** indices use 
19940 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
19950 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49  quence pColl.  I
19960 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
19970 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c  recompute.** all
19980 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68   indices everywh
19990 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ere..*/.#ifndef 
199a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
199b0 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
199c0 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
199d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
199e0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
199f0 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  l){.  Db *pDb;  
19a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a10 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61    /* A single da
19a20 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
19a30 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
19a40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
19a50 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
19a60 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
19a70 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
19a80 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
19a90 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
19aa0 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   */.  HashElem *
19ab0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
19ac0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
19ad0 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20   over tables in 
19ae0 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  pDb */.  Table *
19af0 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
19b00 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
19b10 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
19b20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c  */..  for(iDb=0,
19b30 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44   pDb=db->aDb; iD
19b40 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b  b<db->nDb; iDb++
19b50 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73  , pDb++){.    as
19b60 73 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a  sert( pDb!=0 );.
19b70 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65      for(k=sqlite
19b80 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
19b90 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
19ba0 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48  );  k; k=sqliteH
19bb0 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20  ashNext(k)){.   
19bc0 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65     pTab = (Table
19bd0 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
19be0 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64  (k);.      reind
19bf0 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  exTable(pParse, 
19c00 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  pTab, zColl);.  
19c10 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
19c20 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
19c30 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45   code for the RE
19c40 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
19c50 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  *.**        REIN
19c60 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20  DEX             
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
19c80 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 1.**        RE
19c90 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f  INDEX  <collatio
19ca0 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n>              
19cb0 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20   -- 2.**        
19cc0 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
19cd0 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65  ase>.?<tablename
19ce0 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20  >  -- 3.**      
19cf0 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
19d00 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61  abase>.?<indexna
19d10 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20  me>  -- 4.**.** 
19d20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c  Form 1 causes al
19d30 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
19d40 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
19d50 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c  ses to be rebuil
19d60 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62  t..** Form 2 reb
19d70 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65  uilds all indice
19d80 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
19d90 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  es that use the 
19da0 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69  named.** collati
19db0 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f  ng function.  Fo
19dc0 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75  rms 3 and 4 rebu
19dd0 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  ild the named in
19de0 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e  dex or all.** in
19df0 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
19e00 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20   with the named 
19e10 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  table..*/.#ifnde
19e20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
19e30 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74  INDEX.void sqlit
19e40 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20  e3Reindex(Parse 
19e50 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
19e60 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70  pName1, Token *p
19e70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65  Name2){.  CollSe
19e80 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
19e90 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
19ea0 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62  ng sequence to b
19eb0 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20  e reindexed, or 
19ec0 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  NULL */.  char *
19ed0 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
19ee0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
19ef0 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
19f00 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  x */.  const cha
19f10 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20  r *zDb;         
19f20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
19f30 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
19f40 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
19f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
19f60 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
19f70 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65  tabase */.  Inde
19f80 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
19f90 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
19fa0 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
19fb0 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  ith pTab */.  in
19fc0 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
19fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19fe0 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
19ff0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
1a000 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1a010 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
1a020 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1a030 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  on */.  Token *p
1a040 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  ObjName;        
1a050 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1a060 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
1a070 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  x to be reindexe
1a080 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  d */..  /* Read 
1a090 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
1a0a0 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
1a0b0 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
1a0c0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
1a0d0 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
1a0e0 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
1a0f0 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
1a100 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
1a110 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
1a120 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
1a130 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
1a140 20 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e   pName1==0 || pN
1a150 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  ame1->z==0 ){.  
1a160 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73    reindexDatabas
1a170 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20  es(pParse, 0);. 
1a180 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
1a190 73 65 20 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30  se if( pName2==0
1a1a0 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30   || pName2->z==0
1a1b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a1c0 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20  pName1->z );.   
1a1d0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1a1e0 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
1a1f0 45 4e 43 28 64 62 29 2c 20 28 63 68 61 72 2a 29  ENC(db), (char*)
1a200 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65  pName1->z, pName
1a210 31 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66  1->n, 0);.    if
1a220 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
1a230 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 73   char *zColl = s
1a240 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63 6f  qliteStrNDup((co
1a250 6e 73 74 20 63 68 61 72 20 2a 29 70 4e 61 6d 65  nst char *)pName
1a260 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e 29  1->z, pName1->n)
1a270 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c  ;.      if( zCol
1a280 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 69  l ){.        rei
1a290 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
1a2a0 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  arse, zColl);.  
1a2b0 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
1a2c0 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  (zColl);.      }
1a2d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
1a2e0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 44 62 20 3d     }.  }.  iDb =
1a2f0 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
1a300 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
1a310 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62  e1, pName2, &pOb
1a320 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  jName);.  if( iD
1a330 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
1a340 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
1a350 72 6f 6d 54 6f 6b 65 6e 28 70 4f 62 6a 4e 61 6d  romToken(pObjNam
1a360 65 29 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e  e);.  zDb = db->
1a370 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
1a380 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
1a390 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c  FindTable(db, z,
1a3a0 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61   zDb);.  if( pTa
1a3b0 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  b ){.    reindex
1a3c0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
1a3d0 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ab, 0);.    sqli
1a3e0 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 72  teFree(z);.    r
1a3f0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e  eturn;.  }.  pIn
1a400 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
1a410 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44  dIndex(db, z, zD
1a420 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  b);.  sqliteFree
1a430 28 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  (z);.  if( pInde
1a440 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
1a450 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
1a460 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
1a470 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
1a480 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
1a490 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
1a4a0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1a4b0 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
1a4c0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
1a4d0 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74  le to identify t
1a4e0 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  he object to be 
1a4f0 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23  reindexed");.}.#
1a500 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
1a510 75 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c 79 20  urn a dynamicly 
1a520 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49 6e 66  allocated KeyInf
1a530 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
1a540 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20   can be used.** 
1a550 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65 61 64  with OP_OpenRead
1a560 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65   or OP_OpenWrite
1a570 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 62   to access datab
1a580 61 73 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  ase index pIdx..
1a590 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1a5a0 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72 20 74  ful, a pointer t
1a5b0 6f 20 74 68 65 20 6e 65 77 20 73 74 72 75 63 74  o the new struct
1a5c0 75 72 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ure is returned.
1a5d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
1a5e0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
1a5f0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1a600 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 46 72 65  alling sqliteFre
1a610 65 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72  e() on the retur
1a620 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e  ned .** pointer.
1a630 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1a640 75 72 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f  urs (out of memo
1a650 72 79 20 6f 72 20 6d 69 73 73 69 6e 67 20 63 6f  ry or missing co
1a660 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71 75  llation .** sequ
1a670 65 6e 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20 72  ence), NULL is r
1a680 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
1a690 73 74 61 74 65 20 6f 66 20 70 50 61 72 73 65 20  state of pParse 
1a6a0 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65  updated to refle
1a6b0 63 74 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e  ct.** the error.
1a6c0 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
1a6d0 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
1a6e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1a6f0 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
1a700 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
1a710 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  l = pIdx->nColum
1a720 6e 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 20  n;.  int nBytes 
1a730 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  = sizeof(KeyInfo
1a740 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a  ) + (nCol-1)*siz
1a750 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20  eof(CollSeq*) + 
1a760 6e 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  nCol;.  KeyInfo 
1a770 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f  *pKey = (KeyInfo
1a780 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
1a790 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28 20  nBytes);..  if( 
1a7a0 70 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65 79  pKey ){.    pKey
1a7b0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
1a7c0 75 38 20 2a 29 26 28 70 4b 65 79 2d 3e 61 43 6f  u8 *)&(pKey->aCo
1a7d0 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20 61  ll[nCol]);.    a
1a7e0 73 73 65 72 74 28 20 26 70 4b 65 79 2d 3e 61 53  ssert( &pKey->aS
1a7f0 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d  ortOrder[nCol]==
1a800 26 28 28 28 75 38 20 2a 29 70 4b 65 79 29 5b 6e  &(((u8 *)pKey)[n
1a810 42 79 74 65 73 5d 29 20 29 3b 0a 20 20 20 20 66  Bytes]) );.    f
1a820 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
1a830 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  i++){.      char
1a840 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
1a850 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
1a860 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 20 29   assert( zColl )
1a870 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43  ;.      pKey->aC
1a880 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  oll[i] = sqlite3
1a890 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
1a8a0 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29  arse, zColl, -1)
1a8b0 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53  ;.      pKey->aS
1a8c0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49  ortOrder[i] = pI
1a8d0 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
1a8e0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  ];.    }.    pKe
1a8f0 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c  y->nField = nCol
1a900 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
1a910 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
1a920 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65 79   sqliteFree(pKey
1a930 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 30 3b  );.    pKey = 0;
1a940 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b  .  }.  return pK
1a950 65 79 3b 0a 7d 0a                                ey;.}.