/ Hex Artifact Content
Login

Artifact caece8163ad2cf6be278ad5405f25852c468d8d8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 35 33 38 20 32 30 30 39 2f 30 35 2f 31 31  1.538 2009/05/11
02f0: 20 32 30 3a 35 33 3a 32 39 20 64 72 68 20 45 78   20:53:29 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f  "sqliteInt.h"../
0320: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
0330: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
0340: 20 61 20 6e 65 77 20 53 51 4c 20 73 74 61 74 65   a new SQL state
0350: 6d 65 6e 74 20 69 73 20 62 65 67 69 6e 6e 69 6e  ment is beginnin
0360: 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61 72 73 65  g to.** be parse
0370: 64 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  d.  Initialize t
0380: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
0390: 75 72 65 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ure as needed..*
03a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
03b0: 67 69 6e 50 61 72 73 65 28 50 61 72 73 65 20 2a  ginParse(Parse *
03c0: 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78 70 6c  pParse, int expl
03d0: 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70 50 61 72  ainFlag){.  pPar
03e0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 28 75  se->explain = (u
03f0: 38 29 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20  8)explainFlag;. 
0400: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
0410: 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  0;.}..#ifndef SQ
0420: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0430: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0440: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0450: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0460: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0470: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0480: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0490: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
04a0: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
04b0: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
04d0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
04e0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
04f0: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
0500: 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20 20 20  .  int iTab;    
0510: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
0520: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
0530: 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b  table to be lock
0540: 65 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69  ed */.  u8 isWri
0550: 74 65 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20  teLock;      /* 
0560: 54 72 75 65 20 66 6f 72 20 77 72 69 74 65 20 6c  True for write l
0570: 6f 63 6b 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ock.  False for 
0580: 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
0590: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
05a0: 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me;   /* Name of
05b0: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b   the table */.};
05c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
05d0: 68 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20  he fact that we 
05e0: 77 61 6e 74 20 74 6f 20 6c 6f 63 6b 20 61 20 74  want to lock a t
05f0: 61 62 6c 65 20 61 74 20 72 75 6e 2d 74 69 6d 65  able at run-time
0600: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  .  .**.** The ta
0610: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0620: 20 68 61 73 20 72 6f 6f 74 20 70 61 67 65 20 69   has root page i
0630: 54 61 62 20 61 6e 64 20 69 73 20 66 6f 75 6e 64  Tab and is found
0640: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
0650: 2e 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 61  ..** A read or a
0660: 20 77 72 69 74 65 20 6c 6f 63 6b 20 63 61 6e 20   write lock can 
0670: 62 65 20 74 61 6b 65 6e 20 64 65 70 65 6e 64 69  be taken dependi
0680: 6e 67 20 6f 6e 20 69 73 57 72 69 74 65 6c 6f 63  ng on isWriteloc
0690: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
06a0: 75 74 69 6e 65 20 6a 75 73 74 20 72 65 63 6f 72  utine just recor
06b0: 64 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74  ds the fact that
06c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 65 73   the lock is des
06d0: 69 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 63 6f  ired.  The.** co
06e0: 64 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6c  de to make the l
06f0: 6f 63 6b 20 6f 63 63 75 72 20 69 73 20 67 65 6e  ock occur is gen
0700: 65 72 61 74 65 64 20 62 79 20 61 20 6c 61 74 65  erated by a late
0710: 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 63 6f 64  r call to.** cod
0720: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 20 77 68  eTableLocks() wh
0730: 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
0740: 67 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  g sqlite3FinishC
0750: 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64  oding()..*/.void
0760: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0770: 6b 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  k(.  Parse *pPar
0780: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
0790: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
07a0: 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
07b0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
07c0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
07d0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
07e0: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   to lock */.  in
07f0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
0800: 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75   /* Root page nu
0810: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  mber of the tabl
0820: 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
0830: 2f 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f  /.  u8 isWriteLo
0840: 63 6b 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 66  ck,    /* True f
0850: 6f 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  or a write lock 
0860: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0870: 2a 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20  *zName  /* Name 
0880: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0890: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b 0a  be locked */.){.
08a0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
08b0: 42 79 74 65 73 3b 0a 20 20 54 61 62 6c 65 4c 6f  Bytes;.  TableLo
08c0: 63 6b 20 2a 70 3b 0a 0a 20 20 69 66 28 20 69 44  ck *p;..  if( iD
08d0: 62 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  b<0 ){.    retur
08e0: 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  n;.  }..  for(i=
08f0: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61  0; i<pParse->nTa
0900: 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  bleLock; i++){. 
0910: 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
0920: 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20  aTableLock[i];. 
0930: 20 20 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69     if( p->iDb==i
0940: 44 62 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69  Db && p->iTab==i
0950: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Tab ){.      p->
0960: 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70  isWriteLock = (p
0970: 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c  ->isWriteLock ||
0980: 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20   isWriteLock);. 
0990: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
09a0: 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73   }.  }..  nBytes
09b0: 20 3d 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c   = sizeof(TableL
09c0: 6f 63 6b 29 20 2a 20 28 70 50 61 72 73 65 2d 3e  ock) * (pParse->
09d0: 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20  nTableLock+1);. 
09e0: 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c   pParse->aTableL
09f0: 6f 63 6b 20 3d 20 0a 20 20 20 20 20 20 73 71 6c  ock = .      sql
0a00: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
0a10: 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
0a20: 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f  pParse->aTableLo
0a30: 63 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69  ck, nBytes);.  i
0a40: 66 28 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c  f( pParse->aTabl
0a50: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d  eLock ){.    p =
0a60: 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65   &pParse->aTable
0a70: 4c 6f 63 6b 5b 70 50 61 72 73 65 2d 3e 6e 54 61  Lock[pParse->nTa
0a80: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a90: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0aa0: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0ab0: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0ac0: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0ad0: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d 65  ck;.    p->zName
0ae0: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73   = zName;.  }els
0af0: 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  e{.    pParse->n
0b00: 54 61 62 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20  TableLock = 0;. 
0b10: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d     pParse->db->m
0b20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
0b30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
0b40: 64 65 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f  de an OP_TableLo
0b50: 63 6b 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66  ck instruction f
0b60: 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f  or each table lo
0b70: 63 6b 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73  cked by the.** s
0b80: 74 61 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67  tatement (config
0b90: 75 72 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  ured by calls to
0ba0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0bb0: 6b 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  k())..*/.static 
0bc0: 76 6f 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f  void codeTableLo
0bd0: 63 6b 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  cks(Parse *pPars
0be0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56  e){.  int i;.  V
0bf0: 64 62 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20  dbe *pVdbe; ..  
0c00: 69 66 28 20 30 3d 3d 28 70 56 64 62 65 20 3d 20  if( 0==(pVdbe = 
0c10: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
0c20: 50 61 72 73 65 29 29 20 29 7b 0a 20 20 20 20 72  Parse)) ){.    r
0c30: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f  eturn;.  }..  fo
0c40: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
0c50: 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b  >nTableLock; i++
0c60: 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b  ){.    TableLock
0c70: 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61   *p = &pParse->a
0c80: 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20  TableLock[i];.  
0c90: 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44    int p1 = p->iD
0ca0: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  b;.    sqlite3Vd
0cb0: 62 65 41 64 64 4f 70 34 28 70 56 64 62 65 2c 20  beAddOp4(pVdbe, 
0cc0: 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31  OP_TableLock, p1
0cd0: 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73  , p->iTab, p->is
0ce0: 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  WriteLock,.     
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 53 54   p->zName, P4_ST
0d10: 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ATIC);.  }.}.#el
0d20: 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f 64  se.  #define cod
0d30: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a 23  eTableLocks(x).#
0d40: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
0d50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
0d60: 6c 65 64 20 61 66 74 65 72 20 61 20 73 69 6e 67  led after a sing
0d70: 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  le SQL statement
0d80: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72   has been.** par
0d90: 73 65 64 20 61 6e 64 20 61 20 56 44 42 45 20 70  sed and a VDBE p
0da0: 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74  rogram to execut
0db0: 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
0dc0: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65   has been.** pre
0dd0: 70 61 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75  pared.  This rou
0de0: 74 69 6e 65 20 70 75 74 73 20 74 68 65 20 66 69  tine puts the fi
0df0: 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20  nishing touches 
0e00: 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70  on the.** VDBE p
0e10: 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74  rogram and reset
0e20: 73 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  s the pParse str
0e30: 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e  ucture for the n
0e40: 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a  ext.** parse..**
0e50: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
0e60: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
0e70: 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  ed, it might be 
0e80: 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a  the case that.**
0e90: 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61   no VDBE code wa
0ea0: 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a  s generated..*/.
0eb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69  void sqlite3Fini
0ec0: 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a  shCoding(Parse *
0ed0: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
0ee0: 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
0ef0: 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  v;..  db = pPars
0f00: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
0f10: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
0f20: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
0f30: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72  arse->nested ) r
0f40: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
0f50: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
0f60: 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  rn;..  /* Begin 
0f70: 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20 73 6f  by generating so
0f80: 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  me termination c
0f90: 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ode at the end o
0fa0: 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 65 20  f the.  ** vdbe 
0fb0: 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 20 76  program.  */.  v
0fc0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
0fd0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
0fe0: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
0ff0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
1000: 50 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a  P_Halt);..    /*
1010: 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b   The cookie mask
1020: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69   contains one bi
1030: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
1040: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20  ase file open.. 
1050: 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20     ** (Bit 0 is 
1060: 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20  for main, bit 1 
1070: 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64  is for temp, and
1080: 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74   so forth.)  Bit
1090: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74  s are.    ** set
10a0: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
10b0: 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e  se that is used.
10c0: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
10d0: 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a  to start a.    *
10e0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  * transaction on
10f0: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1100: 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66  ase and to verif
1110: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
1120: 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61  kie.    ** on ea
1130: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
1140: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1150: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1160: 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  oto>0 ){.      u
1170: 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69  32 mask;.      i
1180: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71  nt iDb;.      sq
1190: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
11a0: 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  e(v, pParse->coo
11b0: 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20  kieGoto-1);.    
11c0: 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73    for(iDb=0, mas
11d0: 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  k=1; iDb<db->nDb
11e0: 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b  ; mask<<=1, iDb+
11f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1200: 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e  (mask & pParse->
1210: 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29  cookieMask)==0 )
1220: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1230: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
1240: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
1250: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1260: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f 50 5f  VdbeAddOp2(v,OP_
1270: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62  Transaction, iDb
1280: 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  , (mask & pParse
1290: 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29  ->writeMask)!=0)
12a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  ;.        if( db
12b0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
12c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
12d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12e0: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c  OP_VerifyCookie,
12f0: 20 69 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f   iDb, pParse->co
1300: 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b  okieValue[iDb]);
1310: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1320: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1330: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1340: 42 4c 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BLE.      {.    
1350: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1360: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
1370: 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b  arse->nVtabLock;
1380: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1390: 20 63 68 61 72 20 2a 76 74 61 62 20 3d 20 28 63   char *vtab = (c
13a0: 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 61 70  har *)pParse->ap
13b0: 56 74 61 62 4c 6f 63 6b 5b 69 5d 2d 3e 70 56 74  VtabLock[i]->pVt
13c0: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ab;.          sq
13d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13e0: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
13f0: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1400: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 20 20 7d  VTAB);.        }
1410: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
1420: 3e 6e 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a  >nVtabLock = 0;.
1430: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
1440: 20 20 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c        /* Once al
1450: 6c 20 74 68 65 20 63 6f 6f 6b 69 65 73 20 68 61  l the cookies ha
1460: 76 65 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  ve been verified
1470: 20 61 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   and transaction
1480: 73 20 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20 20  s opened, .     
1490: 20 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 72   ** obtain the r
14a0: 65 71 75 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f  equired table-lo
14b0: 63 6b 73 2e 20 54 68 69 73 20 69 73 20 61 20 6e  cks. This is a n
14c0: 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 74 68 65 20  o-op unless the 
14d0: 0a 20 20 20 20 20 20 2a 2a 20 73 68 61 72 65 64  .      ** shared
14e0: 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20 69  -cache feature i
14f0: 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20  s enabled..     
1500: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 54 61   */.      codeTa
1510: 62 6c 65 4c 6f 63 6b 73 28 70 50 61 72 73 65 29  bleLocks(pParse)
1520: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1530: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1540: 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d  Goto, 0, pParse-
1550: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20 20  >cookieGoto);.  
1560: 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47    }.  }...  /* G
1570: 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  et the VDBE prog
1580: 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78  ram ready for ex
1590: 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69  ecution.  */.  i
15a0: 66 28 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e  f( v && pParse->
15b0: 6e 45 72 72 3d 3d 30 20 26 26 20 21 64 62 2d 3e  nErr==0 && !db->
15c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
15d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
15e0: 42 55 47 0a 20 20 20 20 46 49 4c 45 20 2a 74 72  BUG.    FILE *tr
15f0: 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ace = (db->flags
1600: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72   & SQLITE_VdbeTr
1610: 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74  ace)!=0 ? stdout
1620: 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   : 0;.    sqlite
1630: 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72  3VdbeTrace(v, tr
1640: 61 63 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ace);.#endif.   
1650: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1660: 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 30 20  >iCacheLevel==0 
1670: 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 73 20  );  /* Disables 
1680: 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73 20 6d  and re-enables m
1690: 61 74 63 68 20 2a 2f 0a 20 20 20 20 73 71 6c 69  atch */.    sqli
16a0: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
16b0: 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  (v, pParse->nVar
16c0: 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 0a  , pParse->nMem,.
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
16f0: 3e 6e 54 61 62 2c 20 70 50 61 72 73 65 2d 3e 65  >nTab, pParse->e
1700: 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61  xplain);.    pPa
1710: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
1720: 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73  _DONE;.    pPars
1730: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
1740: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
1750: 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49  pParse->rc==SQLI
1760: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
1770: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
1780: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50  _ERROR;.  }.  pP
1790: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a  arse->nTab = 0;.
17a0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
17b0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53   0;.  pParse->nS
17c0: 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  et = 0;.  pParse
17d0: 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50  ->nVar = 0;.  pP
17e0: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
17f0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1800: 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a  cookieGoto = 0;.
1810: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
1820: 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65   parser and code
1830: 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72   generator recur
1840: 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20  sively in order 
1850: 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  to generate.** c
1860: 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20  ode for the SQL 
1870: 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1880: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
1890: 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65  the pParse conte
18a0: 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  xt.** currently 
18b0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
18c0: 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61  on.  When the pa
18d0: 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75  rser is run recu
18e0: 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20  rsively.** this 
18f0: 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f  way, the final O
1900: 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70  P_Halt is not ap
1910: 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72  pended and other
1920: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1930: 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74  ** and finalizat
1940: 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d  ion steps are om
1950: 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68  itted because th
1960: 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67  ose are handling
1970: 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72   by the.** outer
1980: 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a  most parser..**.
1990: 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e  ** Not everythin
19a0: 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20  g is nestable.  
19b0: 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73  This facility is
19c0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72   designed to per
19d0: 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  mit.** INSERT, U
19e0: 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54  PDATE, and DELET
19f0: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61  E operations aga
1a00: 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54  inst SQLITE_MAST
1a10: 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65  ER.  Use.** care
1a20: 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74   if you decide t
1a30: 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69  o try to use thi
1a40: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f  s routine for so
1a50: 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1a60: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1a70: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61  e3NestedParse(Pa
1a80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1a90: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1aa0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1ab0: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
1ac0: 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
1ad0: 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Msg = 0;.  sqlit
1ae0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1af0: 3e 64 62 3b 0a 23 20 64 65 66 69 6e 65 20 53 41  >db;.# define SA
1b00: 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50  VE_SZ  (sizeof(P
1b10: 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66  arse) - offsetof
1b20: 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20  (Parse,nVar)).  
1b30: 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41 56  char saveBuf[SAV
1b40: 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50  E_SZ];..  if( pP
1b50: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
1b60: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
1b70: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30  Parse->nested<10
1b80: 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20   );  /* Nesting 
1b90: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f  should only be o
1ba0: 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20  f limited depth 
1bb0: 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  */.  va_start(ap
1bc0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53  , zFormat);.  zS
1bd0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  ql = sqlite3VMPr
1be0: 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74  intf(db, zFormat
1bf0: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
1c00: 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  ap);.  if( zSql=
1c10: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1c20: 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20  ;   /* A malloc 
1c30: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1c40: 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65   */.  }.  pParse
1c50: 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65  ->nested++;.  me
1c60: 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26 70  mcpy(saveBuf, &p
1c70: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56  Parse->nVar, SAV
1c80: 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28  E_SZ);.  memset(
1c90: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30  &pParse->nVar, 0
1ca0: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71  , SAVE_SZ);.  sq
1cb0: 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 70  lite3RunParser(p
1cc0: 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45  Parse, zSql, &zE
1cd0: 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
1ce0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
1cf0: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
1d00: 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b  bFree(db, zSql);
1d10: 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73  .  memcpy(&pPars
1d20: 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66  e->nVar, saveBuf
1d30: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50  , SAVE_SZ);.  pP
1d40: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a  arse->nested--;.
1d50: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
1d60: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
1d70: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
1d80: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
1d90: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
1da0: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
1db0: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
1dc0: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
1dd0: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
1de0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1df0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
1e00: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
1e10: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
1e20: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
1e30: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
1e40: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
1e50: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
1e60: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
1e70: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
1e80: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
1e90: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
1ea0: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
1eb0: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
1ec0: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
1ed0: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
1ee0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
1ef0: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
1f00: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
1f10: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
1f20: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
1f30: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
1f40: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
1f50: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
1f60: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1f70: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
1f80: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1f90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
1fa0: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
1fb0: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
1fc0: 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20  ;.  int nName;. 
1fd0: 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d   assert( zName!=
1fe0: 30 20 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73  0 );.  nName = s
1ff0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2000: 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 4f  Name);.  for(i=O
2010: 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62  MIT_TEMPDB; i<db
2020: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
2030: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
2040: 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53   i^1 : i;   /* S
2050: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
2060: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
2070: 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26  ( zDatabase!=0 &
2080: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
2090: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
20a0: 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20  aDb[j].zName) ) 
20b0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20  continue;.    p 
20c0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
20d0: 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53  d(&db->aDb[j].pS
20e0: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
20f0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
2100: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
2110: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
2130: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
2140: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
2150: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
2160: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
2170: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
2180: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
2190: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
21a0: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
21b0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
21c0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
21d0: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
21e0: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
21f0: 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61  d.  Also leave a
2200: 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  n.** error messa
2210: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
2220: 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rrMsg..**.** The
2230: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
2240: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
2250: 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64   and sqlite3Find
2260: 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20  Table() is that 
2270: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
2280: 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20  leaves an error 
2290: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
22a0: 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65  e->zErrMsg where
22b0: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54  .** sqlite3FindT
22c0: 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e  able() does not.
22d0: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
22e0: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20  e3LocateTable(. 
22f0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2300: 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65          /* conte
2310: 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72  xt in which to r
2320: 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a  eport errors */.
2330: 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20    int isView,   
2340: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2350: 20 69 66 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20   if looking for 
2360: 61 20 56 49 45 57 20 72 61 74 68 65 72 20 74 68  a VIEW rather th
2370: 61 6e 20 61 20 54 41 42 4c 45 20 2a 2f 0a 20 20  an a TABLE */.  
2380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2390: 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e,     /* Name o
23a0: 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
23b0: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a  re looking for *
23c0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
23d0: 7a 44 62 61 73 65 20 20 20 20 20 2f 2a 20 4e 61  zDbase     /* Na
23e0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
23f0: 73 65 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55  se.  Might be NU
2400: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  LL */.){.  Table
2410: 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20   *p;..  /* Read 
2420: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
2430: 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
2440: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
2450: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
2460: 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
2470: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
2480: 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
2490: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
24a0: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
24b0: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
24c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  turn 0;.  }..  p
24d0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
24e0: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
24f0: 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a  zName, zDbase);.
2500: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
2510: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
2520: 73 67 20 3d 20 69 73 56 69 65 77 20 3f 20 22 6e  sg = isView ? "n
2530: 6f 20 73 75 63 68 20 76 69 65 77 22 20 3a 20 22  o such view" : "
2540: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b 0a  no such table";.
2550: 20 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29      if( zDbase )
2560: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2570: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2580: 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73  "%s: %s.%s", zMs
2590: 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65  g, zDbase, zName
25a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
25b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
25c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a  Msg(pParse, "%s:
25d0: 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d   %s", zMsg, zNam
25e0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  e);.    }.    pP
25f0: 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
2600: 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  a = 1;.  }.  ret
2610: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
2620: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
2630: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
2640: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a  hat describes .*
2650: 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  * a particular i
2660: 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e  ndex given the n
2670: 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65  ame of that inde
2680: 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d  x.** and the nam
2690: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
26a0: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
26b0: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  the index..** Re
26c0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
26d0: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
26e0: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
26f0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
2700: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
2710: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64  the.** table and
2720: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
2730: 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74  ing index is ret
2740: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
2750: 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c  king.** for dupl
2760: 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65  icate index name
2770: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
2780: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
2790: 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20  .** TEMP first, 
27a0: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
27b0: 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61  any auxiliary da
27c0: 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a  tabases added.**
27d0: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
27e0: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e  H command..*/.In
27f0: 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  dex *sqlite3Find
2800: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
2810: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2820: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
2830: 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20   *zDb){.  Index 
2840: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
2850: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
2860: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2870: 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 4f  Name);.  for(i=O
2880: 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62  MIT_TEMPDB; i<db
2890: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
28a0: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
28b0: 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65   i^1 : i;  /* Se
28c0: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
28d0: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68   MAIN */.    Sch
28e0: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64  ema *pSchema = d
28f0: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d  b->aDb[j].pSchem
2900: 61 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26  a;.    if( zDb &
2910: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
2920: 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d  (zDb, db->aDb[j]
2930: 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e  .zName) ) contin
2940: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
2950: 70 53 63 68 65 6d 61 20 7c 7c 20 28 6a 3d 3d 31  pSchema || (j==1
2960: 20 26 26 20 21 64 62 2d 3e 61 44 62 5b 31 5d 2e   && !db->aDb[1].
2970: 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
2980: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
2990: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
29a0: 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69  Find(&pSchema->i
29b0: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e  dxHash, zName, n
29c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
29d0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
29e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
29f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
2a00: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
2a10: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
2a20: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
2a30: 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b  Index(Index *p){
2a40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2a50: 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 64 62 4d 65   p->pTable->dbMe
2a60: 6d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 64  m;.  testcase( d
2a70: 62 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  b==0 );.  sqlite
2a80: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
2a90: 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74  ColAff);.  sqlit
2aa0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
2ab0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
2ac0: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
2ad0: 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
2ae0: 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20  hash table, and 
2af0: 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f  free.** its memo
2b00: 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ry structures..*
2b10: 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  *.** The index i
2b20: 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
2b30: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 68  he database hash
2b40: 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69   tables but.** i
2b50: 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65  t is not unlinke
2b60: 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  d from the Table
2b70: 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65 73   that it indexes
2b80: 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66  ..** Unlinking f
2b90: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75  rom the Table mu
2ba0: 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68  st be done by th
2bb0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2bc0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
2bd0: 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  id sqlite3Delete
2be0: 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b  Index(Index *p){
2bf0: 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a  .  Index *pOld;.
2c00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
2c10: 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a  ame = p->zName;.
2c20: 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65  .  pOld = sqlite
2c30: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e  3HashInsert(&p->
2c40: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
2c50: 2c 20 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  , zName,.       
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c70: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c 65      sqlite3Strle
2c80: 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 30 29 3b 0a  n30(zName), 0);.
2c90: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d    assert( pOld==
2ca0: 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a  0 || pOld==p );.
2cb0: 20 20 66 72 65 65 49 6e 64 65 78 28 70 29 3b 0a    freeIndex(p);.
2cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  }../*.** For the
2cd0: 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49   index called zI
2ce0: 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20  dxName which is 
2cf0: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74  found in the dat
2d00: 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e  abase iDb,.** un
2d10: 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20  like that index 
2d20: 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74  from its Table t
2d30: 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69  hen remove the i
2d40: 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  ndex from.** the
2d50: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
2d60: 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d  e and free all m
2d70: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
2d80: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
2d90: 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ith the index..*
2da0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
2db0: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2dc0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
2dd0: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
2de0: 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a  har *zIdxName){.
2df0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
2e00: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61  .  int len;.  Ha
2e10: 73 68 20 2a 70 48 61 73 68 20 3d 20 26 64 62 2d  sh *pHash = &db-
2e20: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
2e30: 61 2d 3e 69 64 78 48 61 73 68 3b 0a 0a 20 20 6c  a->idxHash;..  l
2e40: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
2e50: 65 6e 33 30 28 7a 49 64 78 4e 61 6d 65 29 3b 0a  en30(zIdxName);.
2e60: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
2e70: 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61  e3HashInsert(pHa
2e80: 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65  sh, zIdxName, le
2e90: 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e  n, 0);.  if( pIn
2ea0: 64 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20 70  dex ){.    if( p
2eb0: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
2ec0: 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b  Index==pIndex ){
2ed0: 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
2ee0: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20  Table->pIndex = 
2ef0: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
2f00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f10: 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20  Index *p;.      
2f20: 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54  for(p=pIndex->pT
2f30: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20  able->pIndex; p 
2f40: 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e  && p->pNext!=pIn
2f50: 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  dex; p=p->pNext)
2f60: 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20 26  {}.      if( p &
2f70: 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64  & p->pNext==pInd
2f80: 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ex ){.        p-
2f90: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d  >pNext = pIndex-
2fa0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
2fb0: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
2fc0: 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d  dex(pIndex);.  }
2fd0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
2fe0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
2ff0: 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  nges;.}../*.** E
3000: 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20  rase all schema 
3010: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
3020: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   the in-memory h
3030: 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a  ash tables of.**
3040: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
3050: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
3060: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
3070: 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a  eclaim memory.**
3080: 20 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61   before the data
3090: 62 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74  base closes.  It
30a0: 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20   is also called 
30b0: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
30c0: 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65  k.** if there we
30d0: 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  re schema change
30e0: 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61  s during the tra
30f0: 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61  nsaction or if a
3100: 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69  .** schema-cooki
3110: 65 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72  e mismatch occur
3120: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3d  s..**.** If iDb=
3130: 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68  =0 then reset th
3140: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
3150: 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c  a tables for all
3160: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
3170: 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 31 20 74  es.  If iDb>=1 t
3180: 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e  hen reset the in
3190: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f  ternal schema fo
31a0: 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69  r only the.** si
31b0: 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61  ngle file indica
31c0: 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
31d0: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
31e0: 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20  lSchema(sqlite3 
31f0: 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  *db, int iDb){. 
3200: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73   int i, j;.  ass
3210: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
3220: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20  Db<db->nDb );.. 
3230: 20 69 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a 20   if( iDb==0 ){. 
3240: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
3250: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 7d  nterAll(db);.  }
3260: 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c  .  for(i=iDb; i<
3270: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3280: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
3290: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
32a0: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29  ( pDb->pSchema )
32b0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 69  {.      assert(i
32c0: 3d 3d 31 20 7c 7c 20 28 70 44 62 2d 3e 70 42 74  ==1 || (pDb->pBt
32d0: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
32e0: 48 6f 6c 64 73 4d 75 74 65 78 28 70 44 62 2d 3e  HoldsMutex(pDb->
32f0: 70 42 74 29 29 29 3b 0a 20 20 20 20 20 20 73 71  pBt)));.      sq
3300: 6c 69 74 65 33 53 63 68 65 6d 61 46 72 65 65 28  lite3SchemaFree(
3310: 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pDb->pSchema);. 
3320: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62     }.    if( iDb
3330: 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d  >0 ) return;.  }
3340: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d  .  assert( iDb==
3350: 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  0 );.  db->flags
3360: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
3370: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c  rnChanges;.  sql
3380: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
3390: 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  l(db);..  /* If 
33a0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
33b0: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
33c0: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20  abase files has 
33d0: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a  been closed,.  *
33e0: 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  * then remove th
33f0: 65 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69  em from the auxi
3400: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c  liary database l
3410: 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68  ist.  We take th
3420: 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69  e.  ** opportuni
3430: 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65  ty to do this he
3440: 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65  re since we have
3450: 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c   just deleted al
3460: 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63  l of the.  ** sc
3470: 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73  hema hash tables
3480: 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64   and therefore d
3490: 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61  o not have to ma
34a0: 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20  ke any changes. 
34b0: 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68   ** to any of th
34c0: 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  ose tables..  */
34d0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
34e0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
34f0: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
3500: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
3510: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
3520: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
3530: 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62  pDb->pAux && pDb
3540: 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70 44 62  ->xFreeAux ) pDb
3550: 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e  ->xFreeAux(pDb->
3560: 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62  pAux);.      pDb
3570: 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20  ->pAux = 0;.    
3580: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d  }.  }.  for(i=j=
3590: 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  2; i<db->nDb; i+
35a0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
35b0: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
35c0: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
35d0: 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  b->pBt==0 ){.   
35e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
35f0: 28 64 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29  (db, pDb->zName)
3600: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61  ;.      pDb->zNa
3610: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  me = 0;.      co
3620: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
3630: 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20    if( j<i ){.   
3640: 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20     db->aDb[j] = 
3650: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
3660: 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  }.    j++;.  }. 
3670: 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62   memset(&db->aDb
3680: 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62  [j], 0, (db->nDb
3690: 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  -j)*sizeof(db->a
36a0: 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e  Db[j]));.  db->n
36b0: 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62  Db = j;.  if( db
36c0: 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e  ->nDb<=2 && db->
36d0: 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74  aDb!=db->aDbStat
36e0: 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  ic ){.    memcpy
36f0: 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20  (db->aDbStatic, 
3700: 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f  db->aDb, 2*sizeo
3710: 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a  f(db->aDb[0]));.
3720: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3730: 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a  e(db, db->aDb);.
3740: 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62      db->aDb = db
3750: 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d  ->aDbStatic;.  }
3760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
3770: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3780: 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f   when a commit o
3790: 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ccurs..*/.void s
37a0: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
37b0: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
37c0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e  te3 *db){.  db->
37d0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
37e0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
37f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
3800: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
3810: 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 6f 72 20  from a table or 
3820: 76 69 65 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  view..*/.static 
3830: 76 6f 69 64 20 73 71 6c 69 74 65 52 65 73 65 74  void sqliteReset
3840: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c  ColumnNames(Tabl
3850: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e  e *pTable){.  in
3860: 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  t i;.  Column *p
3870: 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
3880: 64 62 20 3d 20 70 54 61 62 6c 65 2d 3e 64 62 4d  db = pTable->dbM
3890: 65 6d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  em;.  testcase( 
38a0: 64 62 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db==0 );.  asser
38b0: 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a  t( pTable!=0 );.
38c0: 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54    if( (pCol = pT
38d0: 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29  able->aCol)!=0 )
38e0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
38f0: 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
3900: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
3910: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3920: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  (db, pCol->zName
3930: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3940: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3950: 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20  Col->pDflt);.   
3960: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3970: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  (db, pCol->zType
3980: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3990: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
39a0: 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  >zColl);.    }. 
39b0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
39c0: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f  (db, pTable->aCo
39d0: 6c 29 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  l);.  }.  pTable
39e0: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->aCol = 0;.  pT
39f0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
3a00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
3a10: 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20  the memory data 
3a20: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
3a30: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
3a40: 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20  iven.** Table.  
3a50: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
3a60: 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74  ade to disk by t
3a70: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
3a80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3a90: 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65  just deletes the
3aa0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e   data structure.
3ab0: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e    It does not un
3ac0: 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c  link.** the tabl
3ad0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
3ae0: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
3af0: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
3b00: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
3b10: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
3b20: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
3b30: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
3b40: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3b50: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
3b60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
3b70: 6c 65 74 65 54 61 62 6c 65 28 54 61 62 6c 65 20  leteTable(Table 
3b80: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65  *pTable){.  Inde
3b90: 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78  x *pIndex, *pNex
3ba0: 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  t;.  FKey *pFKey
3bb0: 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 20 20  , *pNextFKey;.  
3bc0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
3bd0: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
3be0: 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
3bf0: 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 3b 0a 20 20  Table->dbMem;.  
3c00: 74 65 73 74 63 61 73 65 28 20 64 62 3d 3d 30 20  testcase( db==0 
3c10: 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  );..  /* Do not 
3c20: 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65  delete the table
3c30: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72   until the refer
3c40: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
3c50: 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 70 54  es zero. */.  pT
3c60: 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  able->nRef--;.  
3c70: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  if( pTable->nRef
3c80: 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
3c90: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
3ca0: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20  pTable->nRef==0 
3cb0: 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  );..  /* Delete 
3cc0: 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f  all indices asso
3cd0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
3ce0: 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f   table.  */.  fo
3cf0: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
3d00: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
3d10: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
3d20: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
3d30: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
3d40: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
3d50: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65  >pSchema==pTable
3d60: 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
3d70: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e   sqlite3DeleteIn
3d80: 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d  dex(pIndex);.  }
3d90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3da0: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
3db0: 59 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  Y.  /* Delete al
3dc0: 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  l foreign keys a
3dd0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3de0: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
3df0: 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c 65  for(pFKey=pTable
3e00: 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20  ->pFKey; pFKey; 
3e10: 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79 29  pFKey=pNextFKey)
3e20: 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79 20  {.    pNextFKey 
3e30: 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72  = pFKey->pNextFr
3e40: 6f 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  om;.    sqlite3D
3e50: 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29  bFree(db, pFKey)
3e60: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
3e70: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61  /* Delete the Ta
3e80: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74  ble structure it
3e90: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  self..  */.  sql
3ea0: 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iteResetColumnNa
3eb0: 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20 20 73  mes(pTable);.  s
3ec0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3ed0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
3ee0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
3ef0: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f  (db, pTable->zCo
3f00: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  lAff);.  sqlite3
3f10: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
3f20: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
3f30: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
3f40: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73  E_OMIT_CHECK.  s
3f50: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3f60: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68  (db, pTable->pCh
3f70: 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  eck);.#endif.  s
3f80: 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28  qlite3VtabClear(
3f90: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
3fa0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
3fb0: 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ble);.}../*.** U
3fc0: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
3fd0: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68  table from the h
3fe0: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
3ff0: 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  he delete the.**
4000: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
4010: 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e   with all its in
4020: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
4030: 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20  n keys..*/.void 
4040: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
4050: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
4060: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
4070: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
4080: 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  abName){.  Table
4090: 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a   *p;.  Db *pDb;.
40a0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
40b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
40c0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
40d0: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
40e0: 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61   zTabName && zTa
40f0: 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44  bName[0] );.  pD
4100: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
4110: 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ];.  p = sqlite3
4120: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
4130: 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
4140: 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 0a 20 20 20  h, zTabName,.   
4150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4160: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c       sqlite3Strl
4170: 65 6e 33 30 28 7a 54 61 62 4e 61 6d 65 29 2c 30  en30(zTabName),0
4180: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  );.  sqlite3Dele
4190: 74 65 54 61 62 6c 65 28 70 29 3b 0a 20 20 64 62  teTable(p);.  db
41a0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
41b0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
41c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
41d0: 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20  a token, return 
41e0: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f  a string that co
41f0: 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65  nsists of the te
4200: 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f  xt of that.** to
4210: 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ken.  Space to h
4220: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
4230: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62   string.** is ob
4240: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
4250: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
4260: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
4270: 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  the calling.** f
4280: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  unction..**.** A
4290: 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72  ny quotation mar
42a0: 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c  ks (ex:  "name",
42b0: 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c   'name', [name],
42c0: 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74   or `name`) that
42d0: 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65  .** surround the
42e0: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b   body of the tok
42f0: 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a  en are removed..
4300: 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65  **.** Tokens are
4310: 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e   often just poin
4320: 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72  ters into the or
4330: 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20  iginal SQL text 
4340: 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f  and so.** are no
4350: 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  t \000 terminate
4360: 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65  d and are not pe
4370: 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72  rsistent.  The r
4380: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
4390: 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e  * is \000 termin
43a0: 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73  ated and is pers
43b0: 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20  istent..*/.char 
43c0: 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d  *sqlite3NameFrom
43d0: 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64  Token(sqlite3 *d
43e0: 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  b, Token *pName)
43f0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
4400: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
4410: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
4420: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
4430: 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a   (char*)pName->z
4440: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
4450: 20 69 66 28 20 70 4e 61 6d 65 2d 3e 71 75 6f 74   if( pName->quot
4460: 65 64 20 29 20 73 71 6c 69 74 65 33 44 65 71 75  ed ) sqlite3Dequ
4470: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ote(zName);.  }e
4480: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
4490: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
44a0: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
44b0: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
44c0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
44d0: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
44e0: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
44f0: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
4500: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
4510: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
4520: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
4530: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50  penMasterTable(P
4540: 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  arse *p, int iDb
4550: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
4560: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29  qlite3GetVdbe(p)
4570: 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
4580: 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53  Lock(p, iDb, MAS
4590: 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53 43 48  TER_ROOT, 1, SCH
45a0: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b  EMA_TABLE(iDb));
45b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
45c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp3(v, OP_OpenW
45d0: 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f  rite, 0, MASTER_
45e0: 52 4f 4f 54 2c 20 69 44 62 29 3b 0a 20 20 73 71  ROOT, iDb);.  sq
45f0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
4600: 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a  4(v, -1, (char *
4610: 29 35 2c 20 50 34 5f 49 4e 54 33 32 29 3b 20 20  )5, P4_INT32);  
4620: 2f 2a 20 35 20 63 6f 6c 75 6d 6e 20 74 61 62 6c  /* 5 column tabl
4630: 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 54  e */.  if( p->nT
4640: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ab==0 ){.    p->
4650: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  nTab = 1;.  }.}.
4660: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
4670: 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f   zName points to
4680: 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
4690: 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  d buffer contain
46a0: 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20  ing the name.** 
46b0: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28 22  of a database ("
46c0: 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 6f 72  main", "temp" or
46d0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
46e0: 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68  attached db). Th
46f0: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  is.** function r
4700: 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64 65 78  eturns the index
4710: 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61   of the named da
4720: 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44  tabase in db->aD
4730: 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69 66  b[], or.** -1 if
4740: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 63 61   the named db ca
4750: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
4760: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  /.int sqlite3Fin
4770: 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65 33 20  dDbName(sqlite3 
4780: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
4790: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
47a0: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
47b0: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
47c0: 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61 6d 65  r */.  if( zName
47d0: 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 3b   ){.    Db *pDb;
47e0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c  .    int n = sql
47f0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
4800: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28  me);.    for(i=(
4810: 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d  db->nDb-1), pDb=
4820: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d  &db->aDb[i]; i>=
4830: 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a  0; i--, pDb--){.
4840: 20 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49 54        if( (!OMIT
4850: 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20  _TEMPDB || i!=1 
4860: 29 20 26 26 20 6e 3d 3d 73 71 6c 69 74 65 33 53  ) && n==sqlite3S
4870: 74 72 6c 65 6e 33 30 28 70 44 62 2d 3e 7a 4e 61  trlen30(pDb->zNa
4880: 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  me) && .        
4890: 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49    0==sqlite3StrI
48a0: 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20  Cmp(pDb->zName, 
48b0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
48c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
48d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
48e0: 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn i;.}../*.** 
48f0: 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65  The token *pName
4900: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
4910: 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
4920: 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20   (either "main" 
4930: 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20  or.** "temp" or 
4940: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61  the name of an a
4950: 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69  ttached db). Thi
4960: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
4970: 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f  s the.** index o
4980: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61  f the named data
4990: 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b  base in db->aDb[
49a0: 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20  ], or -1 if the 
49b0: 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65  named db .** doe
49c0: 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a  s not exist..*/.
49d0: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44  int sqlite3FindD
49e0: 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  b(sqlite3 *db, T
49f0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
4a00: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
4a30: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61   number */.  cha
4a40: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a60: 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65    /* Name we are
4a70: 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a   searching for *
4a80: 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  zName = sqli
4a90: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
4aa0: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
4ab0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
4ac0: 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Name(db, zName);
4ad0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4ae0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
4af0: 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54  eturn i;.}../* T
4b00: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
4b10: 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65   or trigger name
4b20: 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
4b30: 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74  is routine via t
4b40: 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20  okens.** pName1 
4b50: 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74  and pName2. If t
4b60: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61  he table name wa
4b70: 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  s fully qualifie
4b80: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  d, for example:.
4b90: 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42  **.** CREATE TAB
4ba0: 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29  LE xxx.yyy (...)
4bb0: 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e  ;.** .** Then pN
4bc0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
4bd0: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
4be0: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
4bf0: 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74  her hand if.** t
4c00: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  he table name is
4c10: 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69   not fully quali
4c20: 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a  fied, i.e.:.**.*
4c30: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79  * CREATE TABLE y
4c40: 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54  yy(...);.**.** T
4c50: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
4c60: 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70  t to "yyy" and p
4c70: 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a  Name2 is ""..**.
4c80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4c90: 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75  sets the *ppUnqu
4ca0: 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f  al pointer to po
4cb0: 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e  int at the token
4cc0: 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70   (pName1 or.** p
4cd0: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
4ce0: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
4cf0: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20  ed table name.  
4d00: 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  The index of the
4d10: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78 78  .** database "xx
4d20: 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  x" is returned..
4d30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77  */.int sqlite3Tw
4d40: 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72  oPartName(.  Par
4d50: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4d60: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
4d70: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
4d80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
4d90: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
4da0: 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e   /* The "xxx" in
4db0: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
4dc0: 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a  yy" or "xxx" */.
4dd0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
4de0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79        /* The "yy
4df0: 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  y" in the name "
4e00: 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f  xxx.yyy" */.  To
4e10: 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20  ken **pUnqual   
4e20: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75    /* Write the u
4e30: 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63  nqualified objec
4e40: 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29  t name here */.)
4e50: 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  {.  int iDb;    
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
4e80: 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a  ing the object *
4e90: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
4ea0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
4eb0: 20 69 66 28 20 41 4c 57 41 59 53 28 70 4e 61 6d   if( ALWAYS(pNam
4ec0: 65 32 21 3d 30 29 20 26 26 20 70 4e 61 6d 65 32  e2!=0) && pName2
4ed0: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  ->n>0 ){.    if(
4ee0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
4ef0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
4f00: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4f10: 20 22 63 6f 72 72 75 70 74 20 64 61 74 61 62 61   "corrupt databa
4f20: 73 65 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72  se");.      pPar
4f30: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
4f40: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
4f50: 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20   }.    *pUnqual 
4f60: 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44  = pName2;.    iD
4f70: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
4f80: 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  b(db, pName1);. 
4f90: 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a     if( iDb<0 ){.
4fa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
4fb0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
4fc0: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20  nknown database 
4fd0: 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  %T", pName1);.  
4fe0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
4ff0: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
5000: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   -1;.    }.  }el
5010: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
5020: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20  db->init.iDb==0 
5030: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
5040: 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62   );.    iDb = db
5050: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
5060: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
5070: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
5080: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  iDb;.}../*.** Th
5090: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
50a0: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
50b0: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
50c0: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
50d0: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
50e0: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
50f0: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
5100: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
5110: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
5120: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
5130: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
5140: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
5150: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
5160: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
5170: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
5180: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
5190: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
51a0: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
51b0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
51c0: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
51d0: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
51e0: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
51f0: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
5200: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
5210: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
5220: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
5230: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20  e->nested==0 .  
5240: 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72          && (pPar
5250: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
5260: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
5270: 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ma)==0.         
5280: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
5290: 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  rNICmp(zName, "s
52a0: 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20  qlite_", 7) ){. 
52b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
52c0: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65  sg(pParse, "obje
52d0: 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64  ct name reserved
52e0: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73   for internal us
52f0: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
5300: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5310: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
5320: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
5340: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e  constructing a n
5350: 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65  ew table represe
5360: 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72  ntation in memor
5370: 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74  y.  This is.** t
5380: 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65  he first of seve
5390: 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ral action routi
53a0: 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c  nes that get cal
53b0: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a  led in response.
53c0: 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54  ** to a CREATE T
53d0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
53e0: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
53f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5400: 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20  called.** after 
5410: 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43  seeing tokens "C
5420: 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c  REATE" and "TABL
5430: 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  E" and the table
5440: 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d   name. The isTem
5450: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
5460: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
5470: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
5480: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
5490: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
54a0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
54b0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
54c0: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
54d0: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
54e0: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
54f0: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
5500: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
5510: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
5520: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
5530: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
5540: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
5550: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
5560: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
5570: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
5580: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
5590: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
55a0: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
55b0: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
55c0: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
55d0: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
55e0: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
55f0: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
5600: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
5610: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
5620: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5630: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
5640: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
5650: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
5660: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
5670: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
5680: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
5690: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
56a0: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
56b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
56c0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
56d0: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
56e0: 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
56f0: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  t part of the na
5700: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
5710: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  or view */.  Tok
5720: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
5730: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
5740: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
5750: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
5760: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
5770: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
5780: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
5790: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
57a0: 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  iew,      /* Tru
57b0: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
57c0: 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  IEW */.  int isV
57d0: 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75  irtual,   /* Tru
57e0: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
57f0: 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a  IRTUAL table */.
5800: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
5810: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
5820: 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64   if table alread
5830: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
5840: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
5850: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
5860: 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f  0; /* The name o
5870: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
5880: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
5890: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
58a0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
58b0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
58c0: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
58d0: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
58e0: 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ble in */.  Toke
58f0: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  n *pName;    /* 
5900: 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
5910: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
5920: 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a   create */..  /*
5930: 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   The table or vi
5940: 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74  ew name to creat
5950: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
5960: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
5970: 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d  tokens.  ** pNam
5980: 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49  e1 and pName2. I
5990: 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  f the table name
59a0: 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69   was fully quali
59b0: 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  fied, for exampl
59c0: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45  e:.  **.  ** CRE
59d0: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
59e0: 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20  y (...);.  ** . 
59f0: 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20   ** Then pName1 
5a00: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
5a10: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
5a20: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
5a30: 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  and if.  ** the 
5a40: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
5a50: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
5a60: 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20  d, i.e.:.  **.  
5a70: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
5a80: 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20  yyy(...);.  **. 
5a90: 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20   ** Then pName1 
5aa0: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
5ab0: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
5ac0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
5ad0: 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20  call below sets 
5ae0: 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65  the pName pointe
5af0: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
5b00: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
5b10: 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20  or.  ** pName2) 
5b20: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
5b30: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
5b40: 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69  e name. The vari
5b50: 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a  able iDb is.  **
5b60: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
5b70: 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
5b80: 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  e that the table
5b90: 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20 62   or view is to b
5ba0: 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69  e.  ** created i
5bb0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20  n..  */.  iDb = 
5bc0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
5bd0: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
5be0: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
5bf0: 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
5c00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5c10: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
5c20: 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31 20  isTemp && iDb>1 
5c30: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65  ){.    /* If cre
5c40: 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62  ating a temp tab
5c50: 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79  le, the name may
5c60: 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65   not be qualifie
5c70: 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
5c80: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5c90: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
5ca0: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
5cb0: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
5cc0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
5cd0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
5ce0: 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62   && isTemp ) iDb
5cf0: 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d   = 1;..  pParse-
5d00: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
5d10: 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  Name;.  zName = 
5d20: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
5d30: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
5d40: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
5d50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5d60: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
5d70: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
5d80: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
5d90: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
5da0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5db0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
5dc0: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
5dd0: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
5de0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
5df0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
5e00: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
5e10: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
5e20: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
5e30: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
5e40: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
5e50: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
5e60: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
5e70: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
5e80: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
5e90: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
5ea0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
5eb0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5ec0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
5ed0: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
5ee0: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
5ef0: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
5f00: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
5f10: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
5f20: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
5f30: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5f40: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
5f50: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
5f60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
5f70: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
5f80: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
5f90: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
5fa0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
5fb0: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
5fc0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5fd0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
5fe0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
5ff0: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
6000: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
6010: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
6020: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
6030: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
6040: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6050: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6060: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
6070: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
6080: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
6090: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
60a0: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
60b0: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
60c0: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
60d0: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
60e0: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
60f0: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
6100: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
6110: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
6120: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
6130: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
6140: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
6150: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
6160: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
6170: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
6180: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
6190: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
61a0: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
61b0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
61c0: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
61d0: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
61e0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
61f0: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
6200: 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ){.    if( SQLIT
6210: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
6220: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
6230: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
6240: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6250: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c  .    }.    pTabl
6260: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
6270: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
6280: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
6290: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  me);.    if( pTa
62a0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ble ){.      if(
62b0: 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20   !noErr ){.     
62c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
62d0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
62e0: 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69  e %T already exi
62f0: 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  sts", pName);.  
6300: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
6310: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
6320: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
6330: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  ( sqlite3FindInd
6340: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  ex(db, zName, 0)
6350: 21 3d 30 20 26 26 20 28 69 44 62 3d 3d 30 20 7c  !=0 && (iDb==0 |
6360: 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  | !db->init.busy
6370: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
6380: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6390: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
63a0: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
63b0: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
63c0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
63d0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
63e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62     }.  }..  pTab
63f0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  le = sqlite3DbMa
6400: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
6410: 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69  eof(Table));.  i
6420: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
6430: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
6440: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50  iled = 1;.    pP
6450: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
6460: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61  E_NOMEM;.    pPa
6470: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
6480: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6490: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
64a0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
64b0: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
64c0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
64d0: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20  able->pSchema = 
64e0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
64f0: 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  hema;.  pTable->
6500: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  nRef = 1;.  pTab
6510: 6c 65 2d 3e 64 62 4d 65 6d 20 3d 20 30 3b 0a 20  le->dbMem = 0;. 
6520: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
6530: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b  >pNewTable==0 );
6540: 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
6550: 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a  able = pTable;..
6560: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
6570: 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65  the magic sqlite
6580: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
6590: 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72  used by autoincr
65a0: 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e  ement,.  ** then
65b0: 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   record a pointe
65c0: 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  r to this table 
65d0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
65e0: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  base structure. 
65f0: 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45   ** so that INSE
6600: 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20  RT can find the 
6610: 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20  table easily..  
6620: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
6630: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
6640: 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72  MENT.  if( !pPar
6650: 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74  se->nested && st
6660: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  rcmp(zName, "sql
6670: 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d  ite_sequence")==
6680: 30 20 29 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d  0 ){.    pTable-
6690: 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
66a0: 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a  b = pTable;.  }.
66b0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67  #endif..  /* Beg
66c0: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
66d0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
66e0: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
66f0: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
6700: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
6710: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
6720: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
6730: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
6740: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
6750: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
6760: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
6770: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
6780: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
6790: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
67a0: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
67b0: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
67c0: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
67d0: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
67e0: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
67f0: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
6800: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
6810: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
6820: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
6830: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
6840: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6850: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
6860: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
6870: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
6880: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
6890: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
68a0: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
68b0: 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20  {.    int j1;.  
68c0: 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74    int fileFormat
68d0: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20  ;.    int reg1, 
68e0: 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20  reg2, reg3;.    
68f0: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
6900: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
6910: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 0, iDb);..#if
6920: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6930: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
6940: 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20    if( isVirtual 
6950: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6960: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
6970: 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a  _VBegin);.    }.
6980: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
6990: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
69a0: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
69b0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
69c0: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
69d0: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
69e0: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
69f0: 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65     reg1 = pParse
6a00: 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70  ->regRowid = ++p
6a10: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
6a20: 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e   reg2 = pParse->
6a30: 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72  regRoot = ++pPar
6a40: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
6a50: 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  g3 = ++pParse->n
6a60: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
6a70: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6a80: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
6a90: 2c 20 72 65 67 33 2c 20 31 29 3b 20 20 20 2f 2a  , reg3, 1);   /*
6aa0: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20 2a 2f 0a   file_format */.
6ab0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
6ac0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
6ad0: 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74  ;.    j1 = sqlit
6ae0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
6af0: 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 0a 20 20  OP_If, reg3);.  
6b00: 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28    fileFormat = (
6b10: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
6b20: 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
6b30: 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
6b40: 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c           1 : SQL
6b50: 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52  ITE_MAX_FILE_FOR
6b60: 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MAT;.    sqlite3
6b70: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6b80: 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46 6f  _Integer, fileFo
6b90: 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20 20 20  rmat, reg3);.   
6ba0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6bb0: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
6bc0: 69 65 2c 20 69 44 62 2c 20 31 2c 20 72 65 67 33  ie, iDb, 1, reg3
6bd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6be0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6bf0: 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29 2c  nteger, ENC(db),
6c00: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
6c10: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6c20: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
6c30: 44 62 2c 20 34 2c 20 72 65 67 33 29 3b 0a 20 20  Db, 4, reg3);.  
6c40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
6c50: 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20  pHere(v, j1);.. 
6c60: 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20     /* This just 
6c70: 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d  creates a place-
6c80: 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e  holder record in
6c90: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
6ca0: 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  er table..    **
6cb0: 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61   The record crea
6cc0: 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ted does not con
6cd0: 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65  tain anything ye
6ce0: 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72  t.  It will be r
6cf0: 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62  eplaced.    ** b
6d00: 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79  y the real entry
6d10: 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74   in code generat
6d20: 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64  ed at sqlite3End
6d30: 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a  Table()..    **.
6d40: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64      ** The rowid
6d50: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74   for the new ent
6d60: 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  ry is left in re
6d70: 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72  gister pParse->r
6d80: 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20  egRowid..    ** 
6d90: 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  The root page nu
6da0: 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20  mber of the new 
6db0: 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e  table is left in
6dc0: 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67   reg pParse->reg
6dd0: 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65  Root..    ** The
6de0: 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20   rowid and root 
6df0: 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75  page number valu
6e00: 65 73 20 61 72 65 20 6e 65 65 64 65 64 20 62 79  es are needed by
6e10: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20   the code that. 
6e20: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64     ** sqlite3End
6e30: 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72  Table will gener
6e40: 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20  ate..    */.#if 
6e50: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6e60: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
6e70: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6e80: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
6e90: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
6ea0: 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a  || isVirtual ){.
6eb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6ec0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
6ed0: 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b  teger, 0, reg2);
6ee0: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
6ef0: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71  f.    {.      sq
6f00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6f10: 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  v, OP_CreateTabl
6f20: 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a 20  e, iDb, reg2);. 
6f30: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6f40: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
6f50: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
6f60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6f70: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
6f80: 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20  id, 0, reg1);.  
6f90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6fa0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
6fb0: 30 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  0, reg3);.    sq
6fc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6fd0: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c  v, OP_Insert, 0,
6fe0: 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20   reg3, reg1);.  
6ff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
7000: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
7010: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c  APPEND);.    sql
7020: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
7030: 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d  , OP_Close);.  }
7040: 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e  ..  /* Normal (n
7050: 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e  on-error) return
7060: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a  . */.  return;..
7070: 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
7080: 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70   occurs, we jump
7090: 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74   here */.begin_t
70a0: 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71  able_error:.  sq
70b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
70c0: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
70d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
70e0: 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f  macro is used to
70f0: 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72   compare two str
7100: 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69  ings in a case-i
7110: 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65  nsensitive manne
7120: 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67  r..** It is slig
7130: 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e  htly faster than
7140: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
7150: 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63 74  StrICmp() direct
7160: 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75  ly, but.** produ
7170: 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e  ces larger code.
7180: 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20  .**.** WARNING: 
7190: 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f  This macro is no
71a0: 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  t compatible wit
71b0: 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20 66  h the strcmp() f
71c0: 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74  amily. It.** ret
71d0: 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65  urns true if the
71e0: 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65   two strings are
71f0: 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73   equal, otherwis
7200: 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66  e false..*/.#def
7210: 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79  ine STRICMP(x, y
7220: 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65  ) (\.sqlite3Uppe
7230: 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67  rToLower[*(unsig
7240: 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d  ned char *)(x)]=
7250: 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70  =   \.sqlite3Upp
7260: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
7270: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d  gned char *)(y)]
7280: 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65       \.&& sqlite
7290: 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28  3StrICmp((x)+1,(
72a0: 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a  y)+1)==0 )../*.*
72b0: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
72c0: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
72d0: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
72e0: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
72f0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
7300: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
7310: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
7320: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
7330: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
7340: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
7350: 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  .  sqlite3StartT
7360: 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c  able() gets call
7370: 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67  ed.** first to g
7380: 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e  et things going.
7390: 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74    Then this rout
73a0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
73b0: 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  r each.** column
73c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
73d0: 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65  3AddColumn(Parse
73e0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
73f0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  *pName){.  Table
7400: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
7410: 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d  char *z;.  Colum
7420: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  n *pCol;.  sqlit
7430: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
7440: 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  >db;.  if( (p = 
7450: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
7460: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
7470: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
7480: 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e  OLUMN.  if( p->n
7490: 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74  Col+1>db->aLimit
74a0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
74b0: 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c  LUMN] ){.    sql
74c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
74d0: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
74e0: 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70  olumns on %s", p
74f0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
7500: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
7510: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
7520: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
7530: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d  pName);.  if( z=
7540: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
7550: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
7560: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
7570: 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61   STRICMP(z, p->a
7580: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b  Col[i].zName) ){
7590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
75a0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
75b0: 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e  duplicate column
75c0: 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a   name: %s", z);.
75d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
75e0: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
75f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
7600: 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43    }.  if( (p->nC
7610: 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a  ol & 0x7)==0 ){.
7620: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77      Column *aNew
7630: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
7640: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
7650: 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f  ,p->aCol,(p->nCo
7660: 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  l+8)*sizeof(p->a
7670: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Col[0]));.    if
7680: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
7690: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
76a0: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72  (db, z);.      r
76b0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
76c0: 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b   p->aCol = aNew;
76d0: 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70  .  }.  pCol = &p
76e0: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b  ->aCol[p->nCol];
76f0: 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20  .  memset(pCol, 
7700: 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  0, sizeof(p->aCo
7710: 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e  l[0]));.  pCol->
7720: 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f  zName = z;. .  /
7730: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
7740: 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c   type specified,
7750: 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68   columns have th
7760: 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69  e default affini
7770: 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20  ty.  ** 'NONE'. 
7780: 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 79  If there is a ty
7790: 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68  pe specified, th
77a0: 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  en sqlite3AddCol
77b0: 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20  umnType() will. 
77c0: 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65   ** be called ne
77d0: 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e  xt to set pCol->
77e0: 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74  affinity correct
77f0: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d  ly..  */.  pCol-
7800: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
7810: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70  TE_AFF_NONE;.  p
7820: 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  ->nCol++;.}../*.
7830: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7840: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
7850: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
7860: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
7870: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
7880: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
7890: 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c  nt.  A "NOT NULL
78a0: 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73  " constraint has
78b0: 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e  .** been seen on
78c0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73   a column.  This
78d0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
78e0: 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f  e notNull flag o
78f0: 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n.** the column 
7900: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
7910: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
7920: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
7930: 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70  NotNull(Parse *p
7940: 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72  Parse, int onErr
7950: 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  or){.  Table *p;
7960: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
7970: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
7980: 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d  p==0 || NEVER(p-
7990: 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72  >nCol<1) ) retur
79a0: 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  n;.  p->aCol[p->
79b0: 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20  nCol-1].notNull 
79c0: 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d  = (u8)onError;.}
79d0: 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65  ../*.** Scan the
79e0: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d   column type nam
79f0: 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20  e zType (length 
7a00: 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72  nType) and retur
7a10: 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61  n the.** associa
7a20: 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70  ted affinity typ
7a30: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
7a40: 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73  utine does a cas
7a50: 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65  e-independent se
7a60: 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f  arch of zType fo
7a70: 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72  r the .** substr
7a80: 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ings in the foll
7a90: 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20  owing table. If 
7aa0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
7ab0: 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e  rings is.** foun
7ac0: 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  d, the correspon
7ad0: 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73  ding affinity is
7ae0: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54   returned. If zT
7af0: 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ype contains.** 
7b00: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66  more than one of
7b10: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c   the substrings,
7b20: 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20   entries toward 
7b30: 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74  the top of .** t
7b40: 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72  he table take pr
7b50: 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d  iority. For exam
7b60: 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73  ple, if zType is
7b70: 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20   'BLOBINT', .** 
7b80: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
7b90: 45 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ER is returned..
7ba0: 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20  **.** Substring 
7bb0: 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a      | Affinity.*
7bc0: 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
7bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7be0: 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20  --.** 'INT'     
7bf0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7c00: 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41  _INTEGER.** 'CHA
7c10: 52 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  R'        | SQLI
7c20: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
7c30: 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  CLOB'        | S
7c40: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
7c50: 2a 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20  * 'TEXT'        
7c60: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
7c70: 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20  T.** 'BLOB'     
7c80: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7c90: 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20  NONE.** 'REAL'  
7ca0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7cb0: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41  FF_REAL.** 'FLOA
7cc0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7cd0: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44  E_AFF_REAL.** 'D
7ce0: 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  OUB'        | SQ
7cf0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
7d00: 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74  .** If none of t
7d10: 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  he substrings in
7d20: 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65   the above table
7d30: 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53   are found,.** S
7d40: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
7d50: 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  C is returned..*
7d60: 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66  /.char sqlite3Af
7d70: 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74  finityType(const
7d80: 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a   Token *pType){.
7d90: 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63    u32 h = 0;.  c
7da0: 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45  har aff = SQLITE
7db0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
7dc0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
7dd0: 68 61 72 20 2a 7a 49 6e 20 3d 20 70 54 79 70 65  har *zIn = pType
7de0: 2d 3e 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  ->z;.  const uns
7df0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 6e 64  igned char *zEnd
7e00: 20 3d 20 26 70 54 79 70 65 2d 3e 7a 5b 70 54 79   = &pType->z[pTy
7e10: 70 65 2d 3e 6e 5d 3b 0a 0a 20 20 77 68 69 6c 65  pe->n];..  while
7e20: 28 20 7a 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a 20  ( zIn!=zEnd ){. 
7e30: 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20     h = (h<<8) + 
7e40: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
7e50: 77 65 72 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20 7a  wer[*zIn];.    z
7e60: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
7e70: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
7e80: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
7e90: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
7ea0: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
7eb0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
7ec0: 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20  _AFF_TEXT; .    
7ed0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
7ee0: 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  c'<<24)+('l'<<16
7ef0: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
7f00: 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42  ){       /* CLOB
7f10: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
7f20: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
7f30: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
7f40: 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65  ==(('t'<<24)+('e
7f50: 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b  '<<16)+('x'<<8)+
7f60: 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a  't') ){       /*
7f70: 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61   TEXT */.      a
7f80: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
7f90: 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  TEXT;.    }else 
7fa0: 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34  if( h==(('b'<<24
7fb0: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
7fc0: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
7fd0: 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20     /* BLOB */.  
7fe0: 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
7ff0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
8000: 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  C || aff==SQLITE
8010: 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20  _AFF_REAL) ){.  
8020: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
8030: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64  _AFF_NONE;.#ifnd
8040: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
8050: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
8060: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
8070: 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c  ('r'<<24)+('e'<<
8080: 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27  16)+('a'<<8)+'l'
8090: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45  )          /* RE
80a0: 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  AL */.        &&
80b0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
80c0: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
80d0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
80e0: 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c  FF_REAL;.    }el
80f0: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c  se if( h==(('f'<
8100: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
8110: 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20  'o'<<8)+'a')    
8120: 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f        /* FLOA */
8130: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
8140: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
8150: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
8160: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
8170: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
8180: 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b  ( h==(('d'<<24)+
8190: 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c  ('o'<<16)+('u'<<
81a0: 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20  8)+'b')         
81b0: 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20   /* DOUB */.    
81c0: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
81d0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
81e0: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
81f0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23  LITE_AFF_REAL;.#
8200: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20  endif.    }else 
8210: 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46  if( (h&0x00FFFFF
8220: 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28  F)==(('i'<<16)+(
8230: 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20  'n'<<8)+'t') ){ 
8240: 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20     /* INT */.   
8250: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8260: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
8270: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8280: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66    }..  return af
8290: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f;.}../*.** This
82a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
82b0: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
82c0: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
82d0: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
82e0: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
82f0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
8300: 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69  e pFirst token i
8310: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74  s the first.** t
8320: 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75  oken in the sequ
8330: 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74  ence of tokens t
8340: 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65  hat describe the
8350: 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20   type of the.** 
8360: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
8370: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
8380: 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20  ion.   pLast is 
8390: 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a  the last token.*
83a0: 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  * in the sequenc
83b0: 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66  e.  Use this inf
83c0: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73  ormation to cons
83d0: 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a  truct a string.*
83e0: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  * that contains 
83f0: 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20  the typename of 
8400: 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73  the column and s
8410: 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67  tore that string
8420: 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f  .** in zType..*/
8430: 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64   .void sqlite3Ad
8440: 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73  dColumnType(Pars
8450: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
8460: 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c   *pType){.  Tabl
8470: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
8480: 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61  pCol;..  p = pPa
8490: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
84a0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
84b0: 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29  VER(p->nCol<1) )
84c0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20   return;.  pCol 
84d0: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  = &p->aCol[p->nC
84e0: 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ol-1];.  assert(
84f0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20   pCol->zType==0 
8500: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  );.  pCol->zType
8510: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
8520: 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
8530: 64 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43  db, pType);.  pC
8540: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
8550: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
8560: 70 65 28 70 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a  pe(pType);.}../*
8570: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
8580: 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  on is the defaul
8590: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
85a0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
85b0: 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  ded column.** of
85c0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
85d0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
85e0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44  ruction..**.** D
85f0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70  efault value exp
8600: 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65  ressions must be
8610: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73   constant.  Rais
8620: 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69  e an exception i
8630: 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74  f this.** is not
8640: 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a   the case..**.**
8650: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8660: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
8670: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
8680: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
8690: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
86a0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
86b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
86c0: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
86d0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
86e0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
86f0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75  Table *p;.  Colu
8700: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  mn *pCol;.  sqli
8710: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8720: 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50 61 72  ->db;.  p = pPar
8730: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
8740: 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20   if( p!=0 ){.   
8750: 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f   pCol = &(p->aCo
8760: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20  l[p->nCol-1]);. 
8770: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45     if( !sqlite3E
8780: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
8790: 75 6e 63 74 69 6f 6e 28 70 45 78 70 72 29 20 29  unction(pExpr) )
87a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
87b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
87c0: 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f  "default value o
87d0: 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73  f column [%s] is
87e0: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a   not constant",.
87f0: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
8800: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
8810: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f  e{.      /* A co
8820: 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20 75  py of pExpr is u
8830: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
8840: 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20  he original, as 
8850: 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20  pExpr contains. 
8860: 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74       ** tokens t
8870: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c  hat point to vol
8880: 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68  atile memory. Th
8890: 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65 20  e 'span' of the 
88a0: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20  expression.     
88b0: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
88c0: 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65 5f  by pragma table_
88d0: 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  info..      */. 
88e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
88f0: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
8900: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70  >pDflt);.      p
8910: 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c  Col->pDflt = sql
8920: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
8930: 70 45 78 70 72 2c 20 45 58 50 52 44 55 50 5f 52  pExpr, EXPRDUP_R
8940: 45 44 55 43 45 7c 45 58 50 52 44 55 50 5f 53 50  EDUCE|EXPRDUP_SP
8950: 41 4e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  AN);.    }.  }. 
8960: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8970: 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d  te(db, pExpr);.}
8980: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74  ../*.** Designat
8990: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
89a0: 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  Y for the table.
89b0: 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73    pList is a lis
89c0: 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f  t of names .** o
89d0: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66  f columns that f
89e0: 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20  orm the primary 
89f0: 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69  key.  If pList i
8a00: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
8a10: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  .** most recentl
8a20: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f  y added column o
8a30: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74  f the table is t
8a40: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a  he primary key..
8a50: 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61  **.** A table ca
8a60: 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  n have at most o
8a70: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  ne primary key. 
8a80: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   If the table al
8a90: 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70  ready has.** a p
8aa0: 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20  rimary key (and 
8ab0: 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f  this is the seco
8ac0: 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20  nd primary key) 
8ad0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a  then create an.*
8ae0: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  * error..**.** I
8af0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
8b00: 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  Y is on a single
8b10: 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61   column whose da
8b20: 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45  tatype is INTEGE
8b30: 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69  R,.** then we wi
8b40: 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
8b50: 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  at column as the
8b60: 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65   rowid.  Set the
8b70: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
8b80: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
8b90: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
8ba0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
8bb0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
8bc0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
8bd0: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
8be0: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
8bf0: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
8c00: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
8c10: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
8c20: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
8c30: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
8c40: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
8c50: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
8c60: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
8c70: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
8c80: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
8c90: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
8ca0: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
8cb0: 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
8cc0: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
8cd0: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
8ce0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
8cf0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
8d00: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69  ,  /* List of fi
8d10: 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20  eld names to be 
8d20: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
8d30: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
8d40: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
8d50: 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63  h a uniqueness c
8d60: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74  onflict */.  int
8d70: 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f   autoInc,      /
8d80: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55  * True if the AU
8d90: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77  TOINCREMENT keyw
8da0: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
8db0: 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
8dc0: 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  r     /* SQLITE_
8dd0: 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45  SO_ASC or SQLITE
8de0: 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20  _SO_DESC */.){. 
8df0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
8e00: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8e10: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20  ;.  char *zType 
8e20: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
8e30: 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70  = -1, i;.  if( p
8e40: 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43  Tab==0 || IN_DEC
8e50: 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f  LARE_VTAB ) goto
8e60: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
8e70: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  t;.  if( pTab->t
8e80: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
8e90: 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20  PrimaryKey ){.  
8ea0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8eb0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
8ec0: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68   "table \"%s\" h
8ed0: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
8ee0: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70   primary key", p
8ef0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
8f00: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
8f10: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
8f20: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
8f30: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
8f40: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
8f50: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
8f60: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
8f70: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
8f80: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
8f90: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
8fa0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
8fb0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
8fc0: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
8fd0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
8fe0: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
8ff0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
9000: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
9010: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
9020: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
9030: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
9040: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
9050: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
9060: 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  if( iCol<pTab->n
9070: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Col ){.        p
9080: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9090: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
90a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
90b0: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70   if( pList->nExp
90c0: 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b  r>1 ) iCol = -1;
90d0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
90e0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
90f0: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79  >nCol ){.    zTy
9100: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
9110: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d  iCol].zType;.  }
9120: 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26 26 20  .  if( zType && 
9130: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
9140: 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29  Type, "INTEGER")
9150: 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 73  ==0.        && s
9160: 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45  ortOrder==SQLITE
9170: 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 70  _SO_ASC ){.    p
9180: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
9190: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
91a0: 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72  Conf = (u8)onErr
91b0: 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  or;.    assert( 
91c0: 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75  autoInc==0 || au
91d0: 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  toInc==1 );.    
91e0: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
91f0: 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74  = autoInc*TF_Aut
9200: 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 7d 65  oincrement;.  }e
9210: 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20  lse if( autoInc 
9220: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
9230: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
9240: 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33  MENT.    sqlite3
9250: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9260: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
9270: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
9280: 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22  on an ".       "
9290: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
92a0: 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  KEY");.#endif.  
92b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
92c0: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
92d0: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
92e0: 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30  List, onError, 0
92f0: 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20  , 0, sortOrder, 
9300: 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  0);.    pList = 
9310: 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f  0;.  }..primary_
9320: 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  key_exit:.  sqli
9330: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
9340: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
9350: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ist);.  return;.
9360: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
9370: 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ew CHECK constra
9380: 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65  int to the table
9390: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
93a0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
93b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
93c0: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
93d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
93e0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
93f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
9400: 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20  pr *pCheckExpr  
9410: 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70  /* The check exp
9420: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
9430: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9440: 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65  arse->db;.#ifnde
9450: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
9460: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
9470: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
9480: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61  Table;.  if( pTa
9490: 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45  b && !IN_DECLARE
94a0: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 2f 2a 20  _VTAB ){.    /* 
94b0: 54 68 65 20 43 48 45 43 4b 20 65 78 70 72 65 73  The CHECK expres
94c0: 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 64 75 70  sion must be dup
94d0: 6c 69 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  licated so that 
94e0: 74 6f 6b 65 6e 73 20 72 65 66 65 72 0a 20 20 20  tokens refer.   
94f0: 20 2a 2a 20 74 6f 20 6d 61 6c 6c 6f 63 65 64 20   ** to malloced 
9500: 73 70 61 63 65 20 61 6e 64 20 6e 6f 74 20 74 68  space and not th
9510: 65 20 28 65 70 68 65 6d 65 72 61 6c 29 20 74 65  e (ephemeral) te
9520: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
9530: 20 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 73 74   TABLE.    ** st
9540: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 70  atement */.    p
9550: 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71  Tab->pCheck = sq
9560: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
9570: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 0a   pTab->pCheck, .
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
95b0: 28 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 2c  (db, pCheckExpr,
95c0: 20 30 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   0));.  }.#endif
95d0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
95e0: 6c 65 74 65 28 64 62 2c 20 70 43 68 65 63 6b 45  lete(db, pCheckE
95f0: 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  xpr);.}../*.** S
9600: 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  et the collation
9610: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65   function of the
9620: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70   most recently p
9630: 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75  arsed table colu
9640: 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c  mn.** to the Col
9650: 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  lSeq given..*/.v
9660: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
9670: 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20  llateType(Parse 
9680: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
9690: 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65  pToken){.  Table
96a0: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
96b0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
96c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71            /* Deq
96d0: 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f  uoted name of co
96e0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
96f0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
9700: 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70  b;..  if( (p = p
9710: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
9720: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
9730: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
9740: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
9750: 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  b;.  zColl = sql
9760: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
9770: 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  n(db, pToken);. 
9780: 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65   if( !zColl ) re
9790: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c  turn;..  if( sql
97a0: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
97b0: 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
97c0: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
97d0: 49 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c  Idx;.    p->aCol
97e0: 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c  [i].zColl = zCol
97f0: 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  l;.  .    /* If 
9800: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65  the column is de
9810: 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65  clared as "<name
9820: 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f  > PRIMARY KEY CO
9830: 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20  LLATE <type>",. 
9840: 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e     ** then an in
9850: 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65  dex may have bee
9860: 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69  n created on thi
9870: 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20  s column before 
9880: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61  the.    ** colla
9890: 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64  tion type was ad
98a0: 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69  ded. Correct thi
98b0: 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63  s if it is the c
98c0: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
98d0: 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
98e0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
98f0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
9900: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
9910: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20  >nColumn==1 );. 
9920: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
9930: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b  iColumn[0]==i ){
9940: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
9950: 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43  zColl[0] = p->aC
9960: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[i].zColl;.   
9970: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
9980: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
9990: 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
99a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
99b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
99c0: 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  urns the collati
99d0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
99e0: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
99f0: 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67  text.** encoding
9a00: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
9a10: 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c  he string zName,
9a20: 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a   length nName..*
9a30: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
9a40: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ested collation 
9a50: 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20  sequence is not 
9a60: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f  available, or no
9a70: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69  t available.** i
9a80: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  n the database n
9a90: 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20  ative encoding, 
9aa0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
9ab0: 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64  ctory is invoked
9ac0: 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69   to.** request i
9ad0: 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  t. If the collat
9ae0: 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73  ion factory does
9af0: 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68   not supply such
9b00: 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20   a sequence,.** 
9b10: 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65  and the sequence
9b20: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
9b30: 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e   another text en
9b40: 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61  coding, then tha
9b50: 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  t is.** returned
9b60: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
9b70: 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f  If no versions o
9b80: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
9b90: 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65  collations seque
9ba0: 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c  nce are availabl
9bb0: 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72  e, or.** another
9bc0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
9bd0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
9be0: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
9bf0: 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74  sage written int
9c00: 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  o.** pParse..**.
9c10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9c20: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
9c30: 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43  und sqlite3FindC
9c40: 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20  ollSeq().  This 
9c50: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b  routine.** invok
9c60: 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
9c70: 20 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20   factory if the 
9c80: 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  named collation 
9c90: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a  cannot be found.
9ca0: 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ** and generates
9cb0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
9cc0: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
9cd0: 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  o: sqlite3FindCo
9ce0: 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33  llSeq(), sqlite3
9cf0: 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a  GetCollSeq().*/.
9d00: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
9d10: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61  LocateCollSeq(Pa
9d20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
9d30: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
9d40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9d50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75   pParse->db;.  u
9d60: 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
9d70: 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d  .  u8 initbusy =
9d80: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a   db->init.busy;.
9d90: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
9da0: 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  ;..  pColl = sql
9db0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
9dc0: 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20  db, enc, zName, 
9dd0: 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28  initbusy);.  if(
9de0: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
9df0: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
9e00: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43  >xCmp) ){.    pC
9e10: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
9e20: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f 6c  CollSeq(db, pCol
9e30: 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  l, zName);.    i
9e40: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
9e50: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9e60: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
9e70: 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  uch collation se
9e80: 71 75 65 6e 63 65 3a 20 25 73 22 2c 20 7a 4e 61  quence: %s", zNa
9e90: 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  me);.      pColl
9ea0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
9eb0: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
9ec0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
9ed0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
9ee0: 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  ll increment the
9ef0: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
9f00: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  **.** The schema
9f10: 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20   cookie is used 
9f20: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
9f30: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  n the schema for
9f40: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
9f50: 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72   changes.  After
9f60: 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61   each schema cha
9f70: 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20  nge, the cookie 
9f80: 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73  value.** changes
9f90: 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73  .  When a proces
9fa0: 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68  s first reads th
9fb0: 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f  e schema it reco
9fc0: 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69  rds the.** cooki
9fd0: 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20  e.  Thereafter, 
9fe0: 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73  whenever it goes
9ff0: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
a000: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63  atabase,.** it c
a010: 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65  hecks the cookie
a020: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
a030: 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74  e schema has not
a040: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63   changed.** sinc
a050: 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65  e it was last re
a060: 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ad..**.** This p
a070: 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  lan is not compl
a080: 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f  etely bullet-pro
a090: 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  of.  It is possi
a0a0: 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ble for.** the s
a0b0: 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20  chema to change 
a0c0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
a0d0: 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69  nd for the cooki
a0e0: 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62  e to be.** set b
a0f0: 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c  ack to prior val
a100: 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20  ue.  But schema 
a110: 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72  changes are infr
a120: 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  equent.** and th
a130: 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
a140: 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d   hitting the sam
a150: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69  e cookie value i
a160: 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e  s only.** 1 chan
a170: 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20  ce in 2^32.  So 
a180: 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67  we're safe enoug
a190: 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
a1a0: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50  e3ChangeCookie(P
a1b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
a1c0: 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 72 31  t iDb){.  int r1
a1d0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
a1e0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
a1f0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
a200: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
a210: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
a220: 64 62 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dbe;.  sqlite3Vd
a230: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a240: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b  nteger, db->aDb[
a250: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63  iDb].pSchema->sc
a260: 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72  hema_cookie+1, r
a270: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
a280: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
a290: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 2c  tCookie, iDb, 0,
a2a0: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52   r1);.  sqlite3R
a2b0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
a2c0: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
a2d0: 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20  .** Measure the 
a2e0: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
a2f0: 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f  ters needed to o
a300: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a  utput the given.
a310: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ** identifier.  
a320: 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  The number retur
a330: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79  ned includes any
a340: 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20   quotes used.** 
a350: 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  but does not inc
a360: 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65  lude the null te
a370: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  rminator..**.** 
a380: 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20  The estimate is 
a390: 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49  conservative.  I
a3a0: 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  t might be large
a3b0: 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a  r that what is.*
a3c0: 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e  * really needed.
a3d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
a3e0: 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74  dentLength(const
a3f0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
a400: 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a   n;.  for(n=0; *
a410: 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20  z; n++, z++){.  
a420: 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b    if( *z=='"' ){
a430: 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65   n++; }.  }.  re
a440: 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f  turn n + 2;.}../
a450: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
a460: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
a470: 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70  inter to an outp
a480: 75 74 20 62 75 66 66 65 72 2e 20 54 68 65 20 73  ut buffer. The s
a490: 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65  econd .** parame
a4a0: 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
a4b0: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74   to an integer t
a4c0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
a4d0: 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68   offset at.** wh
a4e0: 69 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74  ich to write int
a4f0: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
a500: 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  fer. This functi
a510: 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a  on copies the.**
a520: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
a530: 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74  string pointed t
a540: 6f 20 62 79 20 74 68 65 20 74 68 69 72 64 20 70  o by the third p
a550: 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65  arameter, zSigne
a560: 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68  dIdent,.** to th
a570: 65 20 73 70 65 63 69 66 69 65 64 20 6f 66 66 73  e specified offs
a580: 65 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  et in the buffer
a590: 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49   and updates *pI
a5a0: 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74  dx to refer.** t
a5b0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
a5c0: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
a5d0: 62 79 74 65 20 77 72 69 74 74 65 6e 20 62 65 66  byte written bef
a5e0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
a5f0: 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72  * .** If the str
a600: 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74  ing zSignedIdent
a610: 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
a620: 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65  ly of alpha-nume
a630: 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ric.** character
a640: 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  s, does not begi
a650: 6e 20 77 69 74 68 20 61 20 64 69 67 69 74 20 61  n with a digit a
a660: 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c  nd is not an SQL
a670: 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65   keyword,.** the
a680: 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74  n it is copied t
a690: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
a6a0: 66 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 69  fer exactly as i
a6b0: 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  t is. Otherwise,
a6c0: 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64  .** it is quoted
a6d0: 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75   using double-qu
a6e0: 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  otes..*/.static 
a6f0: 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68  void identPut(ch
a700: 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78  ar *z, int *pIdx
a710: 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49  , char *zSignedI
a720: 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  dent){.  unsigne
a730: 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d  d char *zIdent =
a740: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
a750: 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20  )zSignedIdent;. 
a760: 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51   int i, j, needQ
a770: 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64  uote;.  i = *pId
a780: 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  x;..  for(j=0; z
a790: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
a7a0: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
a7b0: 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a  Isalnum(zIdent[j
a7c0: 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21  ]) && zIdent[j]!
a7d0: 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  ='_' ) break;.  
a7e0: 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20  }.  needQuote = 
a7f0: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
a800: 49 64 65 6e 74 5b 30 5d 29 20 7c 7c 20 73 71 6c  Ident[0]) || sql
a810: 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28  ite3KeywordCode(
a820: 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49  zIdent, j)!=TK_I
a830: 44 3b 0a 20 20 69 66 28 20 21 6e 65 65 64 51 75  D;.  if( !needQu
a840: 6f 74 65 20 29 7b 0a 20 20 20 20 6e 65 65 64 51  ote ){.    needQ
a850: 75 6f 74 65 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  uote = zIdent[j]
a860: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 65 65  ;.  }..  if( nee
a870: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
a880: 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30  = '"';.  for(j=0
a890: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
a8a0: 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20  ){.    z[i++] = 
a8b0: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69  zIdent[j];.    i
a8c0: 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22  f( zIdent[j]=='"
a8d0: 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  ' ) z[i++] = '"'
a8e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64  ;.  }.  if( need
a8f0: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
a900: 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30   '"';.  z[i] = 0
a910: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d  ;.  *pIdx = i;.}
a920: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
a930: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
a940: 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70  statement approp
a950: 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
a960: 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d  ven.** table.  M
a970: 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
a980: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74  e text of the st
a990: 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69  atement is obtai
a9a0: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
a9b0: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
a9c0: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
a9d0: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
a9e0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
a9f0: 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c  char *createTabl
aa00: 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64  eStmt(sqlite3 *d
aa10: 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  b, Table *p){.  
aa20: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
aa30: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
aa40: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
aa50: 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d  , *zEnd;.  Colum
aa60: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30  n *pCol;.  n = 0
aa70: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70  ;.  for(pCol = p
aa80: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
aa90: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
aaa0: 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69  l++){.    n += i
aab0: 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d  dentLength(pCol-
aac0: 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d  >zName) + 5;.  }
aad0: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
aae0: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
aaf0: 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20   if( n<50 ){ .  
ab00: 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20    zSep = "";.   
ab10: 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20   zSep2 = ",";.  
ab20: 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20    zEnd = ")";.  
ab30: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20  }else{.    zSep 
ab40: 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53  = "\n  ";.    zS
ab50: 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20  ep2 = ",\n  ";. 
ab60: 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b     zEnd = "\n)";
ab70: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b  .  }.  n += 35 +
ab80: 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53   6*p->nCol;.  zS
ab90: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  tmt = sqlite3Mal
aba0: 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 69 66 28 20  loc( n );.  if( 
abb0: 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  zStmt==0 ){.    
abc0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
abd0: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
abe0: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
abf0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53  3_snprintf(n, zS
ac00: 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42  tmt, "CREATE TAB
ac10: 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c  LE ");.  k = sql
ac20: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74  ite3Strlen30(zSt
ac30: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
ac40: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
ac50: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
ac60: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
ac70: 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d  pCol=p->aCol, i=
ac80: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
ac90: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
aca0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
acb0: 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65  r * const azType
acc0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
acd0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  * SQLITE_AFF_TEX
ace0: 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22 2c  T    */ " TEXT",
acf0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
ad00: 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 2a  TE_AFF_NONE    *
ad10: 2f 20 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  / "",.        /*
ad20: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
ad30: 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20  RIC */ " NUM",. 
ad40: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
ad50: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20  _AFF_INTEGER */ 
ad60: 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20  " INT",.        
ad70: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  /* SQLITE_AFF_RE
ad80: 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22  AL    */ " REAL"
ad90: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
ada0: 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  len;.    const c
adb0: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20  har *zType;..   
adc0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
add0: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
ade0: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b  , zSep);.    k +
adf0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
ae00: 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  0(&zStmt[k]);.  
ae10: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
ae20: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
ae30: 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e  mt, &k, pCol->zN
ae40: 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ame);.    assert
ae50: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
ae60: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  -SQLITE_AFF_TEXT
ae70: 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73   >= 0 );.    ass
ae80: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
ae90: 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ity-SQLITE_AFF_T
aea0: 45 58 54 20 3c 20 73 69 7a 65 6f 66 28 61 7a 54  EXT < sizeof(azT
aeb0: 79 70 65 29 2f 73 69 7a 65 6f 66 28 61 7a 54 79  ype)/sizeof(azTy
aec0: 70 65 5b 30 5d 29 20 29 3b 0a 20 20 20 20 74 65  pe[0]) );.    te
aed0: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
aee0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
aef0: 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74  FF_TEXT );.    t
af00: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
af10: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
af20: 41 46 46 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20  AFF_NONE );.    
af30: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
af40: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
af50: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a  _AFF_NUMERIC );.
af60: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
af70: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
af80: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
af90: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
afa0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
afb0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
afc0: 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54  L );.    .    zT
afd0: 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f  ype = azType[pCo
afe0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51  l->affinity - SQ
aff0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a  LITE_AFF_TEXT];.
b000: 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65      len = sqlite
b010: 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29  3Strlen30(zType)
b020: 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ;.#ifndef NDEBUG
b030: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61  .    if( pCol->a
b040: 66 66 69 6e 69 74 79 21 3d 53 51 4c 49 54 45 5f  ffinity!=SQLITE_
b050: 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
b060: 20 20 20 54 6f 6b 65 6e 20 74 79 70 65 54 6f 6b     Token typeTok
b070: 65 6e 3b 0a 20 20 20 20 20 20 20 74 79 70 65 54  en;.       typeT
b080: 6f 6b 65 6e 2e 7a 20 3d 20 28 75 38 2a 29 7a 54  oken.z = (u8*)zT
b090: 79 70 65 3b 0a 20 20 20 20 20 20 20 74 79 70 65  ype;.       type
b0a0: 54 6f 6b 65 6e 2e 6e 20 3d 20 6c 65 6e 3b 0a 20  Token.n = len;. 
b0b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
b0c0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71  ol->affinity==sq
b0d0: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
b0e0: 65 28 26 74 79 70 65 54 6f 6b 65 6e 29 20 29 3b  e(&typeToken) );
b0f0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
b100: 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b    memcpy(&zStmt[
b110: 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b  k], zType, len);
b120: 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20  .    k += len;. 
b130: 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20     assert( k<=n 
b140: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
b150: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
b160: 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20  zStmt[k], "%s", 
b170: 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  zEnd);.  return 
b180: 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zStmt;.}../*.** 
b190: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
b1a0: 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74  called to report
b1b0: 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74   the final ")" t
b1c0: 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a  hat terminates.*
b1d0: 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  * a CREATE TABLE
b1e0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
b1f0: 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75  * The table stru
b200: 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72  cture that other
b210: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
b220: 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64   have been build
b230: 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ing.** is added 
b240: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
b250: 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73  hash tables, ass
b260: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
b270: 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64  have.** occurred
b280: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79  ..**.** An entry
b290: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
b2a0: 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61  s made in the ma
b2b0: 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  ster table on di
b2c0: 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68  sk, unless.** th
b2d0: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
b2e0: 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69  y table or db->i
b2f0: 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68  nit.busy==1.  Wh
b300: 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  en db->init.busy
b310: 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  ==1.** it means 
b320: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
b330: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
b340: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
b350: 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63  e just.** connec
b360: 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ted to the datab
b370: 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  ase or because t
b380: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
b390: 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65   table has.** re
b3a0: 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20  cently changed, 
b3b0: 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  so the entry for
b3c0: 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65   this table alre
b3d0: 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a  ady exists in.**
b3e0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
b3f0: 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f  er table.  We do
b400: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
b410: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a  ate it again..**
b420: 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65  .** If the pSele
b430: 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ct argument is n
b440: 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ot NULL, it mean
b450: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
b460: 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65  ine.** was calle
b470: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61  d to create a ta
b480: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72  ble generated fr
b490: 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45  om a .** "CREATE
b4a0: 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45   TABLE ... AS SE
b4b0: 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d  LECT ..." statem
b4c0: 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ent.  The column
b4d0: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
b4e0: 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20   new table will 
b4f0: 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74  match the result
b500: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
b510: 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
b520: 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50  te3EndTable(.  P
b530: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
b540: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
b550: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
b560: 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20  en *pCons,      
b570: 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20       /* The ',' 
b580: 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20  token after the 
b590: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e  last column defn
b5a0: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  . */.  Token *pE
b5b0: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd,            /
b5c0: 2a 20 54 68 65 20 66 69 6e 61 6c 20 27 29 27 20  * The final ')' 
b5d0: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 43 52 45  token in the CRE
b5e0: 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53  ATE TABLE */.  S
b5f0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
b600: 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
b610: 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20   from a "CREATE 
b620: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a  ... AS SELECT" *
b630: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
b640: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b650: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
b660: 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 28  nt iDb;..  if( (
b670: 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65  pEnd==0 && pSele
b680: 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65  ct==0) || pParse
b690: 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
b6a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
b6b0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b6c0: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
b6d0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
b6e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
b6f0: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
b700: 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65  t.busy || !pSele
b710: 63 74 20 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73  ct );..  iDb = s
b720: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
b730: 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65  dex(db, p->pSche
b740: 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
b750: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
b760: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d    /* Resolve nam
b770: 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20  es in all CHECK 
b780: 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65  constraint expre
b790: 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ssions..  */.  i
b7a0: 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a  f( p->pCheck ){.
b7b0: 20 20 20 20 53 72 63 4c 69 73 74 20 73 53 72 63      SrcList sSrc
b7c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b7d0: 20 20 20 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c      /* Fake SrcL
b7e0: 69 73 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e  ist for pParse->
b7f0: 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20 20  pNewTable */.   
b800: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
b810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b820: 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
b830: 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65   for pParse->pNe
b840: 77 54 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6d  wTable */..    m
b850: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
b860: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
b870: 20 6d 65 6d 73 65 74 28 26 73 53 72 63 2c 20 30   memset(&sSrc, 0
b880: 2c 20 73 69 7a 65 6f 66 28 73 53 72 63 29 29 3b  , sizeof(sSrc));
b890: 0a 20 20 20 20 73 53 72 63 2e 6e 53 72 63 20 3d  .    sSrc.nSrc =
b8a0: 20 31 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30   1;.    sSrc.a[0
b8b0: 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61  ].zName = p->zNa
b8c0: 6d 65 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30  me;.    sSrc.a[0
b8d0: 5d 2e 70 54 61 62 20 3d 20 70 3b 0a 20 20 20 20  ].pTab = p;.    
b8e0: 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f  sSrc.a[0].iCurso
b8f0: 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 4e 43 2e  r = -1;.    sNC.
b900: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
b910: 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
b920: 74 20 3d 20 26 73 53 72 63 3b 0a 20 20 20 20 73  t = &sSrc;.    s
b930: 4e 43 2e 69 73 43 68 65 63 6b 20 3d 20 31 3b 0a  NC.isCheck = 1;.
b940: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52      if( sqlite3R
b950: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
b960: 26 73 4e 43 2c 20 70 2d 3e 70 43 68 65 63 6b 29  &sNC, p->pCheck)
b970: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b980: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
b990: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
b9a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
b9b0: 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) */..  /* If th
b9c0: 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
b9d0: 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65  is 1 it means we
b9e0: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
b9f0: 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a   SQL off the.  *
ba00: 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  * "sqlite_master
ba10: 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d  " or "sqlite_tem
ba20: 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  p_master" table 
ba30: 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a  on the disk..  *
ba40: 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74  * So do not writ
ba50: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67  e to the disk ag
ba60: 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68  ain.  Extract th
ba70: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
ba80: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
ba90: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64  table from the d
baa0: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20  b->init.newTnum 
bab0: 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67  field.  (The pag
bac0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68  e number.  ** sh
bad0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
bae0: 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20  ut there by the 
baf0: 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75  sqliteOpenCb rou
bb00: 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  tine.).  */.  if
bb10: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
bb20: 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d  ){.    p->tnum =
bb30: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
bb40: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
bb50: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
bb60: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
bb70: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
bb80: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
bb90: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
bba0: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
bbb0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20  database..  **. 
bbc0: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
bbd0: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
bbe0: 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72  , write the entr
bbf0: 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c  y into the auxil
bc00: 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69  iary.  ** file i
bc10: 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74  nstead of into t
bc20: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
bc30: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
bc40: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
bc50: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
bc60: 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
bc70: 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20  char *zType;    
bc80: 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61  /* "view" or "ta
bc90: 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  ble" */.    char
bca0: 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22   *zType2;   /* "
bcb0: 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22  VIEW" or "TABLE"
bcc0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
bcd0: 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20  tmt;    /* Text 
bce0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
bcf0: 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49  BLE or CREATE VI
bd00: 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EW statement */.
bd10: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
bd20: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
bd30: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
bd40: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c  return;..    sql
bd50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
bd60: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a  , OP_Close, 0);.
bd70: 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20  .    /* .    ** 
bd80: 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65  Initialize zType
bd90: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65   for the new vie
bda0: 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20  w or table..    
bdb0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  */.    if( p->pS
bdc0: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
bdd0: 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74    /* A regular t
bde0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54  able */.      zT
bdf0: 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20  ype = "table";. 
be00: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54       zType2 = "T
be10: 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53  ABLE";.#ifndef S
be20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
be30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
be40: 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20   /* A view */.  
be50: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65      zType = "vie
be60: 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  w";.      zType2
be70: 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69   = "VIEW";.#endi
be80: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
be90: 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45  If this is a CRE
bea0: 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20  ATE TABLE xx AS 
beb0: 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63  SELECT ..., exec
bec0: 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20  ute the SELECT. 
bed0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
bee0: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
bef0: 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72  new table. The r
bf00: 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
bf10: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  for the.    ** n
bf20: 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72  ew table is in r
bf30: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
bf40: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a  regRoot..    **.
bf50: 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
bf60: 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
bf70: 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
bf80: 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
bf90: 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
bfa0: 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
bfb0: 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
bfc0: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
bfd0: 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
bfe0: 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
bff0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
c000: 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61    ** A shared-ca
c010: 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  che write-lock i
c020: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
c030: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e  o write to the n
c040: 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a  ew table,.    **
c050: 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   as a schema-loc
c060: 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  k must have alre
c070: 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ady been obtaine
c080: 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20  d to create it. 
c090: 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73  Since.    ** a s
c0a0: 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75  chema-lock exclu
c0b0: 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61  des all other da
c0c0: 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68  tabase users, th
c0d0: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75  e write-lock wou
c0e0: 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64  ld.    ** be red
c0f0: 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  undant..    */. 
c100: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
c110: 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  {.      SelectDe
c120: 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 54  st dest;.      T
c130: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 0a  able *pSelTab;..
c140: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
c150: 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20  rse->nTab==1);. 
c160: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c170: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
c180: 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73  nWrite, 1, pPars
c190: 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29  e->regRoot, iDb)
c1a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c1b0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31  dbeChangeP5(v, 1
c1c0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
c1d0: 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20  >nTab = 2;.     
c1e0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
c1f0: 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
c200: 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20  T_Table, 1);.   
c210: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
c220: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
c230: 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
c240: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c250: 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31  1(v, OP_Close, 1
c260: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
c270: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
c280: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 20          pSelTab 
c290: 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
c2a0: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
c2b0: 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  e, pSelect);.   
c2c0: 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62       if( pSelTab
c2d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
c2e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
c2f0: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
c300: 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53      p->nCol = pS
c310: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
c320: 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70       p->aCol = p
c330: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
c340: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e        pSelTab->n
c350: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
c360: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
c370: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
c380: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70  te3DeleteTable(p
c390: 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  SelTab);.      }
c3a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
c3b0: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c  ompute the compl
c3c0: 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
c3d0: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
c3e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c   */.    if( pSel
c3f0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74  ect ){.      zSt
c400: 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65  mt = createTable
c410: 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20 20 20  Stmt(db, p);.   
c420: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20   }else{.      n 
c430: 3d 20 28 69 6e 74 29 28 70 45 6e 64 2d 3e 7a 20  = (int)(pEnd->z 
c440: 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  - pParse->sNameT
c450: 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20  oken.z) + 1;.   
c460: 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
c470: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20  e3MPrintf(db, . 
c480: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
c490: 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65   %s %.*s", zType
c4a0: 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e  2, n, pParse->sN
c4b0: 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20  ameToken.z.     
c4c0: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
c4d0: 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65  * A slot for the
c4e0: 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65   record has alre
c4f0: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
c500: 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a  ed in the .    *
c510: 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  * SQLITE_MASTER 
c520: 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20  table.  We just 
c530: 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  need to update t
c540: 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c  hat slot with al
c550: 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66  l.    ** the inf
c560: 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63  ormation we've c
c570: 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f  ollected..    */
c580: 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
c590: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
c5a0: 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51        "UPDATE %Q
c5b0: 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22  .%s ".         "
c5c0: 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e  SET type='%s', n
c5d0: 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65  ame=%Q, tbl_name
c5e0: 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25  =%Q, rootpage=#%
c5f0: 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20  d, sql=%Q ".    
c600: 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d     "WHERE rowid=
c610: 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e  #%d",.      db->
c620: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
c630: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
c640: 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a  ),.      zType,.
c650: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
c660: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
c670: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
c680: 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74  gRoot,.      zSt
c690: 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  mt,.      pParse
c6a0: 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29  ->regRowid.    )
c6b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
c6c0: 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a  ree(db, zStmt);.
c6d0: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
c6e0: 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
c6f0: 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
c700: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
c710: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20  NCREMENT.    /* 
c720: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
c730: 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
c740: 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75  e an sqlite_sequ
c750: 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20  ence table for. 
c760: 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72     ** keeping tr
c770: 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65  ack of autoincre
c780: 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a  ment keys..    *
c790: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 61 62  /.    if( p->tab
c7a0: 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
c7b0: 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  ncrement ){.    
c7c0: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
c7d0: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20  >aDb[iDb];.     
c7e0: 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
c7f0: 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b  a->pSeqTab==0 ){
c800: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c810: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
c820: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43  se,.          "C
c830: 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73  REATE TABLE %Q.s
c840: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e  qlite_sequence(n
c850: 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20  ame,seq)",.     
c860: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a       pDb->zName.
c870: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
c880: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
c890: 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20  .    /* Reparse 
c8a0: 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70  everything to up
c8b0: 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
c8c0: 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
c8d0: 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
c8e0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
c8f0: 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
c900: 62 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  b, 0, 0,.       
c910: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
c920: 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25  db, "tbl_name='%
c930: 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50  q'",p->zName), P
c940: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
c950: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
c960: 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
c970: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
c980: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
c990: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
c9a0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26   db->init.busy &
c9b0: 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  & pParse->nErr==
c9c0: 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  0 ){.    Table *
c9d0: 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d 61  pOld;.    Schema
c9e0: 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70   *pSchema = p->p
c9f0: 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4f 6c 64  Schema;.    pOld
ca00: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
ca10: 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74  sert(&pSchema->t
ca20: 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65  blHash, p->zName
ca30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
ca50: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
ca60: 2d 3e 7a 4e 61 6d 65 29 2c 70 29 3b 0a 20 20 20  ->zName),p);.   
ca70: 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20   if( pOld ){.   
ca80: 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f     assert( p==pO
ca90: 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ld );  /* Malloc
caa0: 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
cab0: 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73  d inside HashIns
cac0: 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 64  ert() */.      d
cad0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
cae0: 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
caf0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  n;.    }.    pPa
cb00: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
cb10: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62   0;.    db->nTab
cb20: 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  le++;.    db->fl
cb30: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
cb40: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69  ternChanges;..#i
cb50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cb60: 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20  T_ALTERTABLE.   
cb70: 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74   if( !p->pSelect
cb80: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
cb90: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63  char *zName = (c
cba0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61 72  onst char *)pPar
cbb0: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
cbc0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d  ;.      int nNam
cbd0: 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
cbe0: 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f   !pSelect && pCo
cbf0: 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20  ns && pEnd );.  
cc00: 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a      if( pCons->z
cc10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
cc20: 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20  Cons = pEnd;.   
cc30: 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65     }.      nName
cc40: 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20   = (int)((const 
cc50: 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20  char *)pCons->z 
cc60: 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  - zName);.      
cc70: 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20  p->addColOffset 
cc80: 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74  = 13 + sqlite3Ut
cc90: 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c  f8CharLen(zName,
cca0: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23   nName);.    }.#
ccb0: 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66  endif.  }.}..#if
ccc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ccd0: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20  _VIEW./*.** The 
cce0: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
ccf0: 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64  s routine in ord
cd00: 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  er to create a n
cd10: 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20  ew VIEW.*/.void 
cd20: 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65  sqlite3CreateVie
cd30: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
cd40: 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70  se,     /* The p
cd50: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
cd60: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69  /.  Token *pBegi
cd70: 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  n,     /* The CR
cd80: 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
cd90: 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65  begins the state
cda0: 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
cdb0: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
cdc0: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
cdd0: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
cde0: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54   the view */.  T
cdf0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
ce00: 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
ce10: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
ce20: 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
ce30: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
ce40: 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45  ect,   /* A SELE
ce50: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
ce60: 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
ce70: 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20  e new view */.  
ce80: 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20  int isTemp,     
ce90: 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61     /* TRUE for a
cea0: 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20   TEMPORARY view 
ceb0: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20  */.  int noErr  
cec0: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72          /* Suppr
ced0: 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ess error messag
cee0: 65 73 20 69 66 20 56 49 45 57 20 61 6c 72 65 61  es if VIEW alrea
cef0: 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
cf00: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
cf10: 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  t n;.  const uns
cf20: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20  igned char *z;. 
cf30: 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44   Token sEnd;.  D
cf40: 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54  bFixer sFix;.  T
cf50: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 69  oken *pName;.  i
cf60: 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65  nt iDb;.  sqlite
cf70: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
cf80: 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
cf90: 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20  e->nVar>0 ){.   
cfa0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
cfb0: 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65  (pParse, "parame
cfc0: 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c  ters are not all
cfd0: 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b  owed in views");
cfe0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
cff0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
d000: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
d010: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
d020: 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73  StartTable(pPars
d030: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
d040: 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c  2, isTemp, 1, 0,
d050: 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70   noErr);.  p = p
d060: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
d070: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
d080: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
d090: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
d0a0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
d0b0: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
d0c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54  ;.  }.  sqlite3T
d0d0: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
d0e0: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
d0f0: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44  2, &pName);.  iD
d100: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
d110: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e  aToIndex(db, p->
d120: 70 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20  pSchema);.  if( 
d130: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
d140: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
d150: 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65  b, "view", pName
d160: 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  ).    && sqlite3
d170: 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c  FixSelect(&sFix,
d180: 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20   pSelect).  ){. 
d190: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
d1a0: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
d1b0: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
d1c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
d1d0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e  a copy of the en
d1e0: 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74  tire SELECT stat
d1f0: 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
d200: 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
d210: 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63  * This will forc
d220: 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74  e all the Expr.t
d230: 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f  oken.z values to
d240: 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
d250: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72    ** allocated r
d260: 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74  ather than point
d270: 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74   to the input st
d280: 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61  ring - which mea
d290: 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  ns that.  ** the
d2a0: 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61  y will persist a
d2b0: 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  fter the current
d2c0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20   sqlite3_exec() 
d2d0: 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20  call returns..  
d2e0: 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20  */.  p->pSelect 
d2f0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
d300: 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20  up(db, pSelect, 
d310: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
d320: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
d330: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
d340: 63 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ct);.  if( db->m
d350: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
d360: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
d370: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
d380: 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  usy ){.    sqlit
d390: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
d3a0: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b  ames(pParse, p);
d3b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
d3c0: 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
d3d0: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
d3e0: 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45  tement.  Make sE
d3f0: 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a  nd point to.  **
d400: 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20   the end..  */. 
d410: 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e   sEnd = pParse->
d420: 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66  sLastToken;.  if
d430: 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26  ( sEnd.z[0]!=0 &
d440: 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27  & sEnd.z[0]!=';'
d450: 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b   ){.    sEnd.z +
d460: 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20  = sEnd.n;.  }.  
d470: 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20  sEnd.n = 0;.  n 
d480: 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d  = (int)(sEnd.z -
d490: 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 7a   pBegin->z);.  z
d4a0: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
d4b0: 65 64 20 63 68 61 72 2a 29 70 42 65 67 69 6e 2d  ed char*)pBegin-
d4c0: 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  >z;.  while( n>0
d4d0: 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27   && (z[n-1]==';'
d4e0: 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 73 70 61   || sqlite3Isspa
d4f0: 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e  ce(z[n-1])) ){ n
d500: 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d  --; }.  sEnd.z =
d510: 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64   &z[n-1];.  sEnd
d520: 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73  .n = 1;..  /* Us
d530: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
d540: 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76  e() to add the v
d550: 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54  iew to the SQLIT
d560: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a  E_MASTER table *
d570: 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61  /.  sqlite3EndTa
d580: 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26  ble(pParse, 0, &
d590: 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75  sEnd, 0);.  retu
d5a0: 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
d5b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
d5c0: 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
d5d0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
d5e0: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
d5f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
d600: 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20  UALTABLE)./*.** 
d610: 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
d620: 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65  ure pTable is re
d630: 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69  ally a VIEW.  Fi
d640: 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20  ll in the names 
d650: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  of.** the column
d660: 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e  s of the view in
d670: 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75   the pTable stru
d680: 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74  cture.  Return t
d690: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
d6a0: 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65  errors.  If an e
d6b0: 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61  rror is seen lea
d6c0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
d6d0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
d6e0: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
d6f0: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
d700: 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
d710: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
d720: 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20  Table){.  Table 
d730: 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41  *pSelTab;   /* A
d740: 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d   fake table from
d750: 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68   which we get th
d760: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
d770: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
d780: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74      /* Copy of t
d790: 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  he SELECT that i
d7a0: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
d7b0: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72  ew */.  int nErr
d7c0: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
d7d0: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
d7e0: 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69  countered */.  i
d7f0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
d800: 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20   /* Temporarily 
d810: 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72  holds the number
d820: 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69   of cursors assi
d830: 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gned */.  sqlite
d840: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d850: 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  db;  /* Database
d860: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20   connection for 
d870: 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f  malloc errors */
d880: 0a 20 20 69 6e 74 20 28 2a 78 41 75 74 68 29 28  .  int (*xAuth)(
d890: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
d8a0: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
d8b0: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  *,const char*,co
d8c0: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20 61  nst char*);..  a
d8d0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b  ssert( pTable );
d8e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d8f0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
d900: 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  LE.  if( sqlite3
d910: 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28  VtabCallConnect(
d920: 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20  pParse, pTable) 
d930: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d940: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
d950: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
d960: 70 54 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e  pTable) ) return
d970: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   0;.#endif..#ifn
d980: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d990: 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69  VIEW.  /* A posi
d9a0: 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20  tive nCol means 
d9b0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  the columns name
d9c0: 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20  s for this view 
d9d0: 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  are.  ** already
d9e0: 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69   known..  */.  i
d9f0: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  f( pTable->nCol>
da00: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
da10: 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e   /* A negative n
da20: 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c  Col is a special
da30: 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20   marker meaning 
da40: 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72  that we are curr
da50: 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e  ently.  ** tryin
da60: 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  g to compute the
da70: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
da80: 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73  If we enter this
da90: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20   routine with.  
daa0: 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43  ** a negative nC
dab0: 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f  ol, it means two
dac0: 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66   or more views f
dad0: 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65  orm a loop, like
dae0: 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
daf0: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
db00: 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a   one AS SELECT *
db10: 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20   FROM two;.  ** 
db20: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
db30: 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20  two AS SELECT * 
db40: 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20  FROM one;.  **. 
db50: 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
db60: 69 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67  is error is caug
db70: 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e  ht previously an
db80: 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d so the followi
db90: 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f  ng test.  ** sho
dba0: 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e  uld always fail.
dbb0: 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65    But we will le
dbc0: 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20  ave it in place 
dbd0: 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
dbe0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
dbf0: 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20  le->nCol<0 ){.  
dc00: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
dc10: 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20  g(pParse, "view 
dc20: 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79  %s is circularly
dc30: 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c   defined", pTabl
dc40: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  e->zName);.    r
dc50: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61  eturn 1;.  }.  a
dc60: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
dc70: 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Col>=0 );..  /* 
dc80: 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
dc90: 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20  ar, it means we 
dca0: 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
dcb0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e  the table names.
dcc0: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
dcd0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
dce0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
dcf0: 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61  lect() will expa
dd00: 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20  nd any.  ** "*" 
dd10: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
dd20: 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74  results set of t
dd30: 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c  he view and will
dd40: 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a   assign cursors.
dd50: 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d    ** to the elem
dd60: 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d  ents of the FROM
dd70: 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65   clause.  But we
dd80: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65   do not want the
dd90: 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  se changes.  ** 
dda0: 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e  to be permanent.
ddb0: 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61    So the computa
ddc0: 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20  tion is done on 
ddd0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
dde0: 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d  LECT.  ** statem
ddf0: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
de00: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a   the view..  */.
de10: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
de20: 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70  ->pSelect );.  p
de30: 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  Sel = sqlite3Sel
de40: 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c  ectDup(db, pTabl
de50: 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  e->pSelect, 0);.
de60: 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20    if( pSel ){.  
de70: 20 20 75 38 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61    u8 enableLooka
de80: 73 69 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  side = db->looka
de90: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20  side.bEnabled;. 
dea0: 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e     n = pParse->n
deb0: 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Tab;.    sqlite3
dec0: 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
ded0: 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65  sors(pParse, pSe
dee0: 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54  l->pSrc);.    pT
def0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  able->nCol = -1;
df00: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
df10: 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b  de.bEnabled = 0;
df20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
df30: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
df40: 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64  ON.    xAuth = d
df50: 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62  b->xAuth;.    db
df60: 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20  ->xAuth = 0;.   
df70: 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
df80: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
df90: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
dfa0: 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68  );.    db->xAuth
dfb0: 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a   = xAuth;.#else.
dfc0: 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
dfd0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
dfe0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
dff0: 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Sel);.#endif.   
e000: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
e010: 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65  Enabled = enable
e020: 4c 6f 6f 6b 61 73 69 64 65 3b 0a 20 20 20 20 70  Lookaside;.    p
e030: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b  Parse->nTab = n;
e040: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62  .    if( pSelTab
e050: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
e060: 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d  ( pTable->aCol==
e070: 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c  0 );.      pTabl
e080: 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
e090: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->nCol;.      p
e0a0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53  Table->aCol = pS
e0b0: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
e0c0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
e0d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c   = 0;.      pSel
e0e0: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
e0f0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
e100: 74 65 54 61 62 6c 65 28 70 53 65 6c 54 61 62 29  teTable(pSelTab)
e110: 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
e120: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 20 7c  pSchema->flags |
e130: 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  = DB_UnresetView
e140: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
e150: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
e160: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72   = 0;.      nErr
e170: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ++;.    }.    sq
e180: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
e190: 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 7d  e(db, pSel);.  }
e1a0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72   else {.    nErr
e1b0: 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ++;.  }.#endif /
e1c0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
e1d0: 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e  EW */.  return n
e1e0: 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20  Err;  .}.#endif 
e1f0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
e200: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
e210: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
e220: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
e230: 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  LE) */..#ifndef 
e240: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
e250: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
e260: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
e270: 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e  om every VIEW in
e280: 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a   database idx..*
e290: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
e2a0: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
e2b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
e2c0: 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c  t idx){.  HashEl
e2d0: 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62  em *i;.  if( !Db
e2e0: 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20  HasProperty(db, 
e2f0: 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
e300: 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a  iews) ) return;.
e310: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
e320: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62  shFirst(&db->aDb
e330: 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  [idx].pSchema->t
e340: 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c  blHash); i;i=sql
e350: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
e360: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
e370: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
e380: 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54  a(i);.    if( pT
e390: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
e3a0: 20 20 20 20 20 73 71 6c 69 74 65 52 65 73 65 74       sqliteReset
e3b0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62  ColumnNames(pTab
e3c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44  );.    }.  }.  D
e3d0: 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64  bClearProperty(d
e3e0: 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
e3f0: 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73  etViews);.}.#els
e400: 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74  e.# define sqlit
e410: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c  eViewResetAll(A,
e420: 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  B).#endif /* SQL
e430: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
e440: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
e450: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
e460: 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20 61  by the VDBE to a
e470: 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e  djust the intern
e480: 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65  al schema.** use
e490: 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e  d by SQLite when
e4a0: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
e4b0: 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72   moves a table r
e4c0: 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a  oot page. The.**
e4d0: 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20   root-page of a 
e4e0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
e4f0: 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20 68  n database iDb h
e500: 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  as changed from 
e510: 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e  iFrom.** to iTo.
e520: 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31  .**.** Ticket #1
e530: 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c  728:  The symbol
e540: 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69   table might sti
e550: 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72  ll contain infor
e560: 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62  mation.** on tab
e570: 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63  les and/or indic
e580: 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65 20  es that are the 
e590: 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67  process of being
e5a0: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20   deleted..** If 
e5b0: 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c  you are unlucky,
e5c0: 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65   one of those de
e5d0: 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72  leted indices or
e5e0: 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a   tables might.**
e5f0: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 72   have the same r
e600: 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61  ootpage number a
e610: 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65  s the real table
e620: 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20 69   or index that i
e630: 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64  s.** being moved
e640: 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20  .  So we cannot 
e650: 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61  stop searching a
e660: 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20 6d  fter the first m
e670: 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65  atch .** because
e680: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
e690: 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e   might be for on
e6a0: 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64  e of the deleted
e6b0: 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74   indices.** or t
e6c0: 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68  ables and not th
e6d0: 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68  e table/index th
e6e0: 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62  at is actually b
e6f0: 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57  eing moved..** W
e700: 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20  e must continue 
e710: 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c  looping until al
e720: 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64  l tables and ind
e730: 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f  ices with.** roo
e740: 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76  tpage==iFrom hav
e750: 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64  e been converted
e760: 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70   to have a rootp
e770: 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e  age of iTo.** in
e780: 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65 72   order to be cer
e790: 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74  tain that we got
e7a0: 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a   the right one..
e7b0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
e7c0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
e7d0: 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  M.void sqlite3Ro
e7e0: 6f 74 50 61 67 65 4d 6f 76 65 64 28 44 62 20 2a  otPageMoved(Db *
e7f0: 70 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  pDb, int iFrom, 
e800: 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68  int iTo){.  Hash
e810: 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48  Elem *pElem;.  H
e820: 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 70  ash *pHash;..  p
e830: 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
e840: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  hema->tblHash;. 
e850: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
e860: 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
e870: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
e880: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
e890: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
e8a0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
e8b0: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
e8c0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74  .    if( pTab->t
e8d0: 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
e8e0: 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d      pTab->tnum =
e8f0: 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
e900: 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
e910: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
e920: 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
e930: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
e940: 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
e950: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
e960: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49  t(pElem)){.    I
e970: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c  ndex *pIdx = sql
e980: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
e990: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  m);.    if( pIdx
e9a0: 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
e9b0: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75  .      pIdx->tnu
e9c0: 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
e9d0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
e9e0: 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f  ** Write code to
e9f0: 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65   erase the table
ea00: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
ea10: 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61  iTable from data
ea20: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73  base iDb..** Als
ea30: 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20  o write code to 
ea40: 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  modify the sqlit
ea50: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
ea60: 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
ea70: 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d  ma.** if a root-
ea80: 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  page of another 
ea90: 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
eaa0: 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65  y the btree-laye
eab0: 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73  r whilst.** eras
eac0: 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73  ing iTable (this
ead0: 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
eae0: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
eaf0: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73  database)..*/ .s
eb00: 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
eb10: 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65  oyRootPage(Parse
eb20: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
eb30: 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  able, int iDb){.
eb40: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
eb50: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
eb60: 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  e);.  int r1 = s
eb70: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
eb80: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
eb90: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
eba0: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
ebb0: 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 23  ble, r1, iDb);.#
ebc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ebd0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
ebe0: 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73 74  /* OP_Destroy st
ebf0: 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65 67  ores an in integ
ec00: 65 72 20 72 31 2e 20 49 66 20 74 68 69 73 20 69  er r1. If this i
ec10: 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e  nteger.  ** is n
ec20: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
ec30: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
ec40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61  e number of a ta
ec50: 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a  ble moved to.  *
ec60: 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c  * location iTabl
ec70: 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
ec80: 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74   code modifies t
ec90: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
eca0: 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72   table to.  ** r
ecb0: 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a  eflect this..  *
ecc0: 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e  *.  ** The "#NNN
ecd0: 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20  " in the SQL is 
ece0: 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61  a special consta
ecf0: 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68  nt that means wh
ed00: 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a  atever value.  *
ed10: 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72  * is in register
ed20: 20 4e 4e 4e 2e 20 20 53 65 65 20 73 71 6c 69 74   NNN.  See sqlit
ed30: 65 33 52 65 67 69 73 74 65 72 45 78 70 72 28 29  e3RegisterExpr()
ed40: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
ed50: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
ed60: 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54  se, .     "UPDAT
ed70: 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74  E %Q.%s SET root
ed80: 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 25  page=%d WHERE #%
ed90: 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23  d AND rootpage=#
eda0: 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65  %d",.     pParse
edb0: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
edc0: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
edd0: 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65 2c  LE(iDb), iTable,
ede0: 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66   r1, r1);.#endif
edf0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
ee00: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
ee10: 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   r1);.}../*.** W
ee20: 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rite VDBE code t
ee30: 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54  o erase table pT
ee40: 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63  ab and all assoc
ee50: 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e  iated indices on
ee60: 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74   disk..** Code t
ee70: 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c  o update the sql
ee80: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
ee90: 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  s and internal s
eea0: 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e  chema definition
eeb0: 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72  s.** in case a r
eec0: 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69  oot-page belongi
eed0: 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61  ng to another ta
eee0: 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
eef0: 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a  the btree layer.
ef00: 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64  ** is also added
ef10: 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
ef20: 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
ef30: 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
ef40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ef50: 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72  destroyTable(Par
ef60: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
ef70: 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66  e *pTab){.#ifdef
ef80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ef90: 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20  OVACUUM.  Index 
efa0: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 44 62  *pIdx;.  int iDb
efb0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
efc0: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
efd0: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
efe0: 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f  a);.  destroyRoo
eff0: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 54  tPage(pParse, pT
f000: 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ab->tnum, iDb);.
f010: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
f020: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
f030: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
f040: 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  {.    destroyRoo
f050: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
f060: 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  dx->tnum, iDb);.
f070: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49    }.#else.  /* I
f080: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  f the database m
f090: 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75  ay be auto-vacuu
f0a0: 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53 51  m capable (if SQ
f0b0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f0c0: 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  CUUM.  ** is not
f0d0: 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20   defined), then 
f0e0: 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
f0f0: 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72  to call OP_Destr
f100: 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74  oy on the.  ** t
f110: 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72  able and index r
f120: 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64  oot-pages in ord
f130: 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  er, starting wit
f140: 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c  h the numericall
f150: 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  y .  ** largest 
f160: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
f170: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
f180: 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  s that none of t
f190: 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20  he root-pages.  
f1a0: 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79  ** to be destroy
f1b0: 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20  ed is relocated 
f1c0: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50  by an earlier OP
f1d0: 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69  _Destroy. i.e. i
f1e0: 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  f the.  ** follo
f1f0: 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a  wing were coded:
f200: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65  .  **.  ** OP_De
f210: 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e  stroy 4 0.  ** .
f220: 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  ...  ** OP_Destr
f230: 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a  oy 5 0.  **.  **
f240: 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35   and root page 5
f250: 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20   happened to be 
f260: 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
f270: 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20  -page number in 
f280: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
f290: 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67  e, then root pag
f2a0: 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76  e 5 would be mov
f2b0: 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79 20  ed to page 4 by 
f2c0: 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65  the .  ** "OP_De
f2d0: 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64  stroy 4 0" opcod
f2e0: 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65 6e  e. The subsequen
f2f0: 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  t "OP_Destroy 5 
f300: 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a  0" would hit.  *
f310: 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61  * a free-list pa
f320: 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69  ge..  */.  int i
f330: 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  Tab = pTab->tnum
f340: 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79  ;.  int iDestroy
f350: 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  ed = 0;..  while
f360: 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ( 1 ){.    Index
f370: 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20   *pIdx;.    int 
f380: 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20  iLargest = 0;.. 
f390: 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79 65     if( iDestroye
f3a0: 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65  d==0 || iTab<iDe
f3b0: 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20  stroyed ){.     
f3c0: 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62   iLargest = iTab
f3d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
f3e0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
f3f0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
f400: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
f410: 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64    int iIdx = pId
f420: 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61  x->tnum;.      a
f430: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63  ssert( pIdx->pSc
f440: 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
f450: 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ema );.      if(
f460: 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20   (iDestroyed==0 
f470: 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f  || (iIdx<iDestro
f480: 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c  yed)) && iIdx>iL
f490: 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20  argest ){.      
f4a0: 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64    iLargest = iId
f4b0: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
f4c0: 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73  .    if( iLarges
f4d0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
f4e0: 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  turn;.    }else{
f4f0: 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
f500: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
f510: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
f520: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
f530: 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 52  ;.      destroyR
f540: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
f550: 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a  iLargest, iDb);.
f560: 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65 64        iDestroyed
f570: 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20   = iLargest;.   
f580: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a   }.  }.#endif.}.
f590: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
f5a0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
f5b0: 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
f5c0: 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
f5d0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65  tement..** pName
f5e0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
f5f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
f600: 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dropped..*/.void
f610: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c   sqlite3DropTabl
f620: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
f630: 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
f640: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74   int isView, int
f650: 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65   noErr){.  Table
f660: 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a   *pTab;.  Vdbe *
f670: 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
f680: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
f690: 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28   int iDb;..  if(
f6a0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
f6b0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f6c0: 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
f6d0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
f6e0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61   }.  assert( pNa
f6f0: 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
f700: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
f710: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
f720: 65 2c 20 69 73 56 69 65 77 2c 20 0a 20 20 20 20  e, isView, .    
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f740: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 61          pName->a
f750: 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
f760: 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
f770: 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  );..  if( pTab==
f780: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45  0 ){.    if( noE
f790: 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rr ){.      sqli
f7a0: 74 65 33 45 72 72 6f 72 43 6c 65 61 72 28 70 50  te3ErrorClear(pP
f7b0: 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
f7c0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
f7d0: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62  table;.  }.  iDb
f7e0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
f7f0: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
f800: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
f810: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
f820: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
f830: 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20    /* If pTab is 
f840: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
f850: 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c   call ViewGetCol
f860: 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e  umnNames() to en
f870: 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  sure.  ** it is 
f880: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
f890: 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
f8a0: 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74  l(pTab) && sqlit
f8b0: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
f8c0: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
f8d0: 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  b) ){.    goto e
f8e0: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
f8f0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
f900: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
f910: 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
f920: 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
f930: 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
f940: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
f950: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
f960: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
f970: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
f980: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
f990: 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  2 = 0;.    if( s
f9a0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
f9b0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
f9c0: 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
f9d0: 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74  zDb)){.      got
f9e0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
f9f0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
fa00: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
fa10: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
fa20: 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
fa30: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
fa40: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
fa50: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
fa60: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
fa70: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45   SQLITE_DROP_VIE
fa80: 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  W;.      }.#ifnd
fa90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
faa0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
fab0: 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74  }else if( IsVirt
fac0: 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
fad0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
fae0: 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20  _DROP_VTABLE;.  
faf0: 20 20 20 20 7a 41 72 67 32 20 3d 20 70 54 61 62      zArg2 = pTab
fb00: 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23  ->pMod->zName;.#
fb10: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
fb20: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
fb30: 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
fb40: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
fb50: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
fb60: 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
fb70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
fb80: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
fb90: 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ROP_TABLE;.     
fba0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
fbb0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
fbc0: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
fbd0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72  pTab->zName, zAr
fbe0: 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  g2, zDb) ){.    
fbf0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
fc00: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
fc10: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
fc20: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
fc30: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54  QLITE_DELETE, pT
fc40: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  ab->zName, 0, zD
fc50: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
fc60: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
fc70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
fc80: 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  if.  if( sqlite3
fc90: 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
fca0: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
fcb0: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71   7)==0 ){.    sq
fcc0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
fcd0: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
fce0: 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70  may not be dropp
fcf0: 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
fd00: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
fd10: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
fd20: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fd30: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
fd40: 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c  Ensure DROP TABL
fd50: 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e  E is not used on
fd60: 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f   a view, and DRO
fd70: 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73  P VIEW is not us
fd80: 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62  ed.  ** on a tab
fd90: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  le..  */.  if( i
fda0: 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
fdb0: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
fdc0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
fdd0: 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
fde0: 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
fdf0: 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54  te table %s", pT
fe00: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
fe10: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
fe20: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
fe30: 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d  !isView && pTab-
fe40: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
fe50: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
fe60: 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
fe70: 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65  P VIEW to delete
fe80: 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d   view %s", pTab-
fe90: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
fea0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
feb0: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
fec0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
fed0: 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
fee0: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d  table from the m
fef0: 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  aster table.  **
ff00: 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
ff10: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
ff20: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
ff30: 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72 69 67  f( v ){.    Trig
ff40: 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20  ger *pTrigger;. 
ff50: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
ff60: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
ff70: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
ff80: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
ff90: 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 1, iDb);..#if
ffa0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ffb0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
ffc0: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
ffd0: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 69  pTab) ){.      i
ffe0: 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20 20 20  f( v ){.        
fff0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10000 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b  0(v, OP_VBegin);
10010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
10020 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72  endif..    /* Dr
10030 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20  op all triggers 
10040 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
10050 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
10060 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20  dropped. Code.  
10070 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65    ** is generate
10080 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72  d to remove entr
10090 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ies from sqlite_
100a0 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20  master and/or.  
100b0 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70    ** sqlite_temp
100c0 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69  _master if requi
100d0 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
100e0 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74  pTrigger = sqlit
100f0 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50  e3TriggerList(pP
10100 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20  arse, pTab);.   
10110 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
10120 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
10130 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68  ( pTrigger->pSch
10140 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
10150 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  ma || .         
10160 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
10170 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
10180 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
10190 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67  sqlite3DropTrigg
101a0 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54  erPtr(pParse, pT
101b0 72 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20 70  rigger);.      p
101c0 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
101d0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
101e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
101f0 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
10200 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  ENT.    /* Remov
10210 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66  e any entries of
10220 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
10230 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63  ence table assoc
10240 69 61 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a  iated with.    *
10250 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * the table bein
10260 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20  g dropped. This 
10270 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74  is done before t
10280 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70  he table is drop
10290 70 65 64 0a 20 20 20 20 2a 2a 20 61 74 20 74 68  ped.    ** at th
102a0 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69  e btree level, i
102b0 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74  n case the sqlit
102c0 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
102d0 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a   needs to.    **
102e0 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c   move as a resul
102f0 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63  t of the drop (c
10300 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74  an happen in aut
10310 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a  o-vacuum mode)..
10320 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
10330 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
10340 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
10350 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10360 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
10370 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45  rse,.        "DE
10380 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c  LETE FROM %s.sql
10390 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45  ite_sequence WHE
103a0 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
103b0 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c       pDb->zName,
103c0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pTab->zName.   
103d0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64     );.    }.#end
103e0 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20  if..    /* Drop 
103f0 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  all SQLITE_MASTE
10400 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  R table and inde
10410 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72  x entries that r
10420 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20  efer to the.    
10430 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72  ** table. The pr
10440 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73  ogram name loops
10450 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73   through the mas
10460 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65  ter table and de
10470 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65  letes.    ** eve
10480 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65  ry row that refe
10490 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66  rs to a table of
104a0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
104b0 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a  s the one being.
104c0 20 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20      ** dropped. 
104d0 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e  Triggers are han
104e0 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79 20  dled seperately 
104f0 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65  because a trigge
10500 72 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20  r can be.    ** 
10510 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74  created in the t
10520 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61  emp database tha
10530 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
10540 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20  ble in another. 
10550 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a     ** database..
10560 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
10570 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
10580 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22  arse, .        "
10590 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
105a0 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65  s WHERE tbl_name
105b0 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74  =%Q and type!='t
105c0 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20  rigger'",.      
105d0 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43    pDb->zName, SC
105e0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
105f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
10600 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6e 79 20      /* Drop any 
10610 73 74 61 74 69 73 74 69 63 73 20 66 72 6f 6d 20  statistics from 
10620 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
10630 20 74 61 62 6c 65 2c 20 69 66 20 69 74 20 65 78   table, if it ex
10640 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ists */.    if( 
10650 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
10660 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  (db, "sqlite_sta
10670 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  t1", db->aDb[iDb
10680 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ].zName) ){.    
10690 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
106a0 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
106b0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
106c0 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74  M %Q.sqlite_stat
106d0 31 20 57 48 45 52 45 20 74 62 6c 3d 25 51 22 2c  1 WHERE tbl=%Q",
106e0 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61   pDb->zName, pTa
106f0 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29  b->zName.      )
10700 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
10710 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56   !isView && !IsV
10720 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
10730 20 20 20 20 20 20 64 65 73 74 72 6f 79 54 61 62        destroyTab
10740 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  le(pParse, pTab)
10750 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10760 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  Remove the table
10770 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69   entry from SQLi
10780 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63  te's internal sc
10790 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a  hema and modify.
107a0 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d      ** the schem
107b0 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f  a cookie..    */
107c0 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75  .    if( IsVirtu
107d0 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
107e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
107f0 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72  Op4(v, OP_VDestr
10800 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  oy, iDb, 0, 0, p
10810 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
10820 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
10830 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
10840 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62  P_DropTable, iDb
10850 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 0, pTab->zN
10860 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
10870 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
10880 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
10890 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52   }.  sqliteViewR
108a0 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29  esetAll(db, iDb)
108b0 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  ;..exit_drop_tab
108c0 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  le:.  sqlite3Src
108d0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
108e0 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
108f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10900 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
10910 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b   a new foreign k
10920 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a  ey on the table.
10930 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
10940 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
10950 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72    pFromCol deter
10960 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75  mines which colu
10970 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  mns.** in the cu
10980 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e  rrent table poin
10990 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e  t to the foreign
109a0 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43   key.  If pFromC
109b0 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f  ol==0 then.** co
109c0 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f  nnect the key to
109d0 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
109e0 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20   inserted.  pTo 
109f0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a  is the name of.*
10a00 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  * the table refe
10a10 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c  rred to.  pToCol
10a20 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61   is a list of ta
10a30 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65  bles in the othe
10a40 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74  r.** pTo table t
10a50 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20  hat the foreign 
10a60 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  key points to.  
10a70 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61  flags contains a
10a80 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
10a90 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66  n about the conf
10aa0 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
10ab0 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69  algorithms speci
10ac0 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  fied.** in the O
10ad0 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44  N DELETE, ON UPD
10ae0 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52  ATE and ON INSER
10af0 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  T clauses..**.**
10b00 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75   An FKey structu
10b10 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  re is created an
10b20 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  d added to the t
10b30 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a  able currently.*
10b40 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  * under construc
10b50 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72  tion in the pPar
10b60 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69  se->pNewTable fi
10b70 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  eld..**.** The f
10b80 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65  oreign key is se
10b90 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20  t for IMMEDIATE 
10ba0 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73  processing.  A s
10bb0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
10bc0 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65  * to sqlite3Defe
10bd0 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69  rForeignKey() mi
10be0 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20  ght change this 
10bf0 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a  to DEFERRED..*/.
10c00 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
10c10 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20  teForeignKey(.  
10c20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10c30 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
10c40 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
10c50 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c  rList *pFromCol,
10c60 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
10c70 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20  this table that 
10c80 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74  point to other t
10c90 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  able */.  Token 
10ca0 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  *pTo,          /
10cb0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74  * Name of the ot
10cc0 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  her table */.  E
10cd0 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c  xprList *pToCol,
10ce0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69      /* Columns i
10cf0 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  n the other tabl
10d00 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
10d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
10d20 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
10d30 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a  on algorithms. *
10d40 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
10d50 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10d60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10d70 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
10d80 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d  .  FKey *pFKey =
10d90 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d   0;.  Table *p =
10da0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
10db0 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  le;.  int nByte;
10dc0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
10dd0 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nCol;.  char *z;
10de0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21  ..  assert( pTo!
10df0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
10e00 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
10e10 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56   || IN_DECLARE_V
10e20 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  TAB ) goto fk_en
10e30 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  d;.  if( pFromCo
10e40 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  l==0 ){.    int 
10e50 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  iCol = p->nCol-1
10e60 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
10e70 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
10e80 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26      if( pToCol &
10e90 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
10ea0 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
10eb0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
10ec0 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  se, "foreign key
10ed0 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20   on %s".        
10ee0 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65   " should refere
10ef0 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c  nce only one col
10f00 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22  umn of table %T"
10f10 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43  ,.         p->aC
10f20 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20  ol[iCol].zName, 
10f30 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  pTo);.      goto
10f40 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20   fk_end;.    }. 
10f50 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d     nCol = 1;.  }
10f60 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20  else if( pToCol 
10f70 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
10f80 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  !=pFromCol->nExp
10f90 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
10fa0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10fb0 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72  .        "number
10fc0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66   of columns in f
10fd0 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20  oreign key does 
10fe0 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
10ff0 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20  mber of ".      
11000 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68    "columns in th
11010 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
11020 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  le");.    goto f
11030 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k_end;.  }else{.
11040 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d      nCol = pFrom
11050 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  Col->nExpr;.  }.
11060 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
11070 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c  (*pFKey) + (nCol
11080 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79  -1)*sizeof(pFKey
11090 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f  ->aCol[0]) + pTo
110a0 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70  ->n + 1;.  if( p
110b0 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
110c0 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e  (i=0; i<pToCol->
110d0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
110e0 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69     nByte += sqli
110f0 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43  te3Strlen30(pToC
11100 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20  ol->a[i].zName) 
11110 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
11120 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   pFKey = sqlite3
11130 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
11140 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
11150 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  pFKey==0 ){.    
11160 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
11170 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20  .  pFKey->pFrom 
11180 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  = p;.  pFKey->pN
11190 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b  extFrom = p->pFK
111a0 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a  ey;.  z = (char*
111b0 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43  )&pFKey->aCol[nC
111c0 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54  ol];.  pFKey->zT
111d0 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28  o = z;.  memcpy(
111e0 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e  z, pTo->z, pTo->
111f0 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20  n);.  z[pTo->n] 
11200 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  = 0;.  sqlite3De
11210 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d  quote(z);.  z +=
11220 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b   pTo->n+1;.  pFK
11230 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ey->nCol = nCol;
11240 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
11250 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 ){.    pFKey-
11260 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d  >aCol[0].iFrom =
11270 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65   p->nCol-1;.  }e
11280 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
11290 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
112a0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
112b0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
112c0 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
112d0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
112e0 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b  StrICmp(p->aCol[
112f0 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43  j].zName, pFromC
11300 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  ol->a[i].zName)=
11310 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11320 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  pFKey->aCol[i].i
11330 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  From = j;.      
11340 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
11350 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11360 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f     if( j>=p->nCo
11370 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
11380 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11390 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
113a0 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20  "unknown column 
113b0 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67  \"%s\" in foreig
113c0 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
113d0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  ", .          pF
113e0 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
113f0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
11400 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20  o fk_end;.      
11410 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
11420 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
11430 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
11440 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
11450 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
11460 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  en30(pToCol->a[i
11470 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
11480 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  pFKey->aCol[i].z
11490 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d  Col = z;.      m
114a0 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
114b0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
114c0 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
114d0 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
114e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
114f0 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
11500 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c   0;.  pFKey->del
11510 65 74 65 43 6f 6e 66 20 3d 20 28 75 38 29 28 66  eteConf = (u8)(f
11520 6c 61 67 73 20 26 20 30 78 66 66 29 3b 0a 20 20  lags & 0xff);.  
11530 70 46 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e  pFKey->updateCon
11540 66 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20  f = (u8)((flags 
11550 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b 0a  >> 8 ) & 0xff);.
11560 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43    pFKey->insertC
11570 6f 6e 66 20 3d 20 28 75 38 29 28 28 66 6c 61 67  onf = (u8)((flag
11580 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66  s >> 16 ) & 0xff
11590 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  );..  /* Link th
115a0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f  e foreign key to
115b0 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68   the table as th
115c0 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a  e last step..  *
115d0 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70  /.  p->pFKey = p
115e0 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20  FKey;.  pFKey = 
115f0 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71  0;..fk_end:.  sq
11600 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11610 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f  pFKey);.#endif /
11620 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
11630 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
11640 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  EY) */.  sqlite3
11650 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
11660 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20  b, pFromCol);.  
11670 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
11680 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c  elete(db, pToCol
11690 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
116a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
116b0 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49  ed when an INITI
116c0 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f  ALLY IMMEDIATE o
116d0 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
116e0 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69  RRED.** clause i
116f0 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f  s seen as part o
11700 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  f a foreign key 
11710 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65  definition.  The
11720 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70   isDeferred.** p
11730 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f  arameter is 1 fo
11740 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
11750 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49  RRED and 0 for I
11760 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
11770 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76  TE..** The behav
11780 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ior of the most 
11790 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
117a0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
117b0 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f  adjusted.** acco
117c0 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rdingly..*/.void
117d0 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
117e0 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70  eignKey(Parse *p
117f0 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66  Parse, int isDef
11800 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20  erred){.#ifndef 
11810 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
11820 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20  IGN_KEY.  Table 
11830 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70  *pTab;.  FKey *p
11840 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61  FKey;.  if( (pTa
11850 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
11860 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46  Table)==0 || (pF
11870 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65  Key = pTab->pFKe
11880 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  y)==0 ) return;.
11890 20 20 61 73 73 65 72 74 28 20 69 73 44 65 66 65    assert( isDefe
118a0 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66  rred==0 || isDef
118b0 65 72 72 65 64 3d 3d 31 20 29 3b 0a 20 20 70 46  erred==1 );.  pF
118c0 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
118d0 3d 20 28 75 38 29 69 73 44 65 66 65 72 72 65 64  = (u8)isDeferred
118e0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
118f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
11900 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20  that will erase 
11910 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78  and refill index
11920 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73   *pIdx.  This is
11930 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74  .** used to init
11940 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63  ialize a newly c
11950 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20  reated index or 
11960 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
11970 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  .** content of a
11980 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f  n index in respo
11990 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58  nse to a REINDEX
119a0 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
119b0 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  if memRootPage i
119c0 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20  s not negative, 
119d0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
119e0 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79  e index is newly
119f0 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68  .** created.  Th
11a00 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63 69  e register speci
11a10 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50  fied by memRootP
11a20 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  age contains the
11a30 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  .** root page nu
11a40 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
11a50 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61  x.  If memRootPa
11a60 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
11a70 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  then.** the inde
11a80 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
11a90 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65   and must be cle
11aa0 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
11ab0 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a  g refilled and.*
11ac0 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
11ad0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
11ae0 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  dex is taken fro
11af0 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a  m pIndex->tnum..
11b00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
11b10 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
11b20 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
11b30 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
11b40 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29  int memRootPage)
11b50 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
11b60 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
11b70 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  ;  /* The table 
11b80 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20  that is indexed 
11b90 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
11ba0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
11bb0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
11bc0 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61  sor used for pTa
11bd0 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  b */.  int iIdx 
11be0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
11bf0 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
11c00 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
11c10 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61  Index */.  int a
11c20 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
11c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
11c40 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c  ress of top of l
11c50 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75  oop */.  int tnu
11c60 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
11c70 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
11c80 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  page of index */
11c90 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cb0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
11cc0 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72  de into this vir
11cd0 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a  tual machine */.
11ce0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b    KeyInfo *pKey;
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d00 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20   /* KeyInfo for 
11d10 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72  index */.  int r
11d20 65 67 49 64 78 4b 65 79 3b 20 20 20 20 20 20 20  egIdxKey;       
11d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
11d40 69 73 74 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e  isters containin
11d50 67 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 20  g the index key 
11d60 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
11d70 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
11d80 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
11d90 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 69  holding assembli
11da0 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  ed index record 
11db0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
11dc0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
11dd0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
11de0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
11df0 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71  /.  int iDb = sq
11e00 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
11e10 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
11e20 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
11e30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
11e40 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
11e50 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
11e60 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
11e70 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65  E_REINDEX, pInde
11e80 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20  x->zName, 0,.   
11e90 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
11ea0 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72  zName ) ){.    r
11eb0 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
11ec0 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20  f..  /* Require 
11ed0 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
11ee0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72  the table to per
11ef0 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74  form this operat
11f00 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
11f10 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
11f20 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
11f30 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 1, pTab->zNam
11f40 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  e);..  v = sqlit
11f50 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
11f60 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
11f70 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65  return;.  if( me
11f80 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a  mRootPage>=0 ){.
11f90 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f      tnum = memRo
11fa0 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b  otPage;.  }else{
11fb0 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64  .    tnum = pInd
11fc0 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71  ex->tnum;.    sq
11fd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11fe0 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75  v, OP_Clear, tnu
11ff0 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70  m, iDb);.  }.  p
12000 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  Key = sqlite3Ind
12010 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
12020 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c  , pIndex);.  sql
12030 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
12040 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
12050 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c  iIdx, tnum, iDb,
12060 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
12070 20 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b        (char *)pK
12080 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P4_KEYINFO_H
12090 41 4e 44 4f 46 46 29 3b 0a 20 20 69 66 28 20 6d  ANDOFF);.  if( m
120a0 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b  emRootPage>=0 ){
120b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
120c0 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a  ChangeP5(v, 1);.
120d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 70 65    }.  sqlite3Ope
120e0 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
120f0 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Tab, iDb, pTab, 
12100 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
12110 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
12120 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12130 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29  Rewind, iTab, 0)
12140 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  ;.  regRecord = 
12150 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
12160 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67  g(pParse);.  reg
12170 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
12180 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
12190 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
121a0 20 69 54 61 62 2c 20 72 65 67 52 65 63 6f 72 64   iTab, regRecord
121b0 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , 1);.  if( pInd
121c0 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
121d0 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 63 6f 6e 73  None ){.    cons
121e0 74 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d  t int regRowid =
121f0 20 72 65 67 49 64 78 4b 65 79 20 2b 20 70 49 6e   regIdxKey + pIn
12200 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  dex->nColumn;.  
12210 20 20 63 6f 6e 73 74 20 69 6e 74 20 6a 32 20 3d    const int j2 =
12220 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
12230 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b 0a  entAddr(v) + 2;.
12240 20 20 20 20 76 6f 69 64 20 2a 20 63 6f 6e 73 74      void * const
12250 20 70 52 65 67 4b 65 79 20 3d 20 53 51 4c 49 54   pRegKey = SQLIT
12260 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 72 65 67  E_INT_TO_PTR(reg
12270 49 64 78 4b 65 79 29 3b 0a 0a 20 20 20 20 2f 2a  IdxKey);..    /*
12280 20 54 68 65 20 72 65 67 69 73 74 65 72 73 20 61   The registers a
12290 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20 4f  ccessed by the O
122a0 50 5f 49 73 55 6e 69 71 75 65 20 6f 70 63 6f 64  P_IsUnique opcod
122b0 65 20 77 65 72 65 20 61 6c 6c 6f 63 61 74 65 64  e were allocated
122c0 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 73 71  .    ** using sq
122d0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
122e0 65 28 29 20 69 6e 73 69 64 65 20 6f 66 20 74 68  e() inside of th
122f0 65 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  e sqlite3Generat
12300 65 49 6e 64 65 78 4b 65 79 28 29 0a 20 20 20 20  eIndexKey().    
12310 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 4a  ** call above. J
12320 75 73 74 20 62 65 66 6f 72 65 20 74 68 61 74 20  ust before that 
12330 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 66 72 65  function was fre
12340 65 64 20 74 68 65 79 20 77 65 72 65 20 72 65 6c  ed they were rel
12350 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 28 6d 61  eased.    ** (ma
12360 64 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  de available to 
12370 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72  the compiler for
12380 20 72 65 75 73 65 29 20 75 73 69 6e 67 20 0a 20   reuse) using . 
12390 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 6c     ** sqlite3Rel
123a0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 29 2e  easeTempRange().
123b0 20 53 6f 20 69 6e 20 73 6f 6d 65 20 77 61 79 73   So in some ways
123c0 20 68 61 76 69 6e 67 20 74 68 65 20 4f 50 5f 49   having the OP_I
123d0 73 55 6e 69 71 75 65 0a 20 20 20 20 2a 2a 20 6f  sUnique.    ** o
123e0 70 63 6f 64 65 20 75 73 65 20 74 68 65 20 76 61  pcode use the va
123f0 6c 75 65 73 20 73 74 6f 72 65 64 20 77 69 74 68  lues stored with
12400 69 6e 20 73 65 65 6d 73 20 64 61 6e 67 65 72 6f  in seems dangero
12410 75 73 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e  us. However, sin
12420 63 65 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e  ce.    ** we can
12430 20 62 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f   be sure that no
12440 20 6f 74 68 65 72 20 74 65 6d 70 20 72 65 67 69   other temp regi
12450 73 74 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  sters have been 
12460 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a  allocated.    **
12470 20 73 69 6e 63 65 20 73 71 6c 69 74 65 33 52 65   since sqlite3Re
12480 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 29  leaseTempRange()
12490 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 69 74 20   was called, it 
124a0 69 73 20 73 61 66 65 20 74 6f 20 64 6f 20 73 6f  is safe to do so
124b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
124c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
124d0 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65 2c 20 69  , OP_IsUnique, i
124e0 49 64 78 2c 20 6a 32 2c 20 72 65 67 52 6f 77 69  Idx, j2, regRowi
124f0 64 2c 20 70 52 65 67 4b 65 79 2c 20 50 34 5f 49  d, pRegKey, P4_I
12500 4e 54 33 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  NT32);.    sqlit
12510 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
12520 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
12530 43 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45 5f 41  CONSTRAINT, OE_A
12540 62 6f 72 74 2c 20 30 2c 0a 20 20 20 20 20 20 20  bort, 0,.       
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 22 69 6e               "in
12560 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  dexed columns ar
12570 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50  e not unique", P
12580 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 20  4_STATIC);.  }. 
12590 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
125a0 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
125b0 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63  rt, iIdx, regRec
125c0 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
125d0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
125e0 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
125f0 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ULT);.  sqlite3R
12600 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
12610 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
12620 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12630 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
12640 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29  , iTab, addr1+1)
12650 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
12660 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
12670 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12680 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
12690 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c  se, iTab);.  sql
126a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
126b0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78  , OP_Close, iIdx
126c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
126d0 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66  te a new index f
126e0 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e  or an SQL table.
126f0 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20    pName1.pName2 
12700 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
12710 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64  he index .** and
12720 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65   pTblList is the
12730 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
12740 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
12750 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20   indexed.  Both 
12760 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c  will .** be NULL
12770 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b   for a primary k
12780 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  ey or an index t
12790 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74  hat is created t
127a0 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55  o satisfy a.** U
127b0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
127c0 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64  .  If pTable and
127d0 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c   pIndex are NULL
127e0 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  , use pParse->pN
127f0 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68  ewTable.** as th
12800 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
12810 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e  dexed.  pParse->
12820 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74  pNewTable is a t
12830 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  able that is.** 
12840 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
12850 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61  constructed by a
12860 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
12870 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70  atement..**.** p
12880 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
12890 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
128a0 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20  indexed.  pList 
128b0 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
128c0 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69  this.** is a pri
128d0 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71  mary key or uniq
128e0 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ue-constraint on
128f0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
12900 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a   column added.**
12910 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
12920 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
12930 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f  nstruction.  .*/
12940 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
12950 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
12960 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
12970 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
12980 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
12990 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
129a0 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69  Name1,     /* Fi
129b0 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65  rst part of inde
129c0 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
129d0 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
129e0 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53  pName2,     /* S
129f0 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e  econd part of in
12a00 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
12a10 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
12a20 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a  st *pTblName, /*
12a30 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   Table to index.
12a40 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
12a50 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
12a60 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
12a70 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
12a80 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
12a90 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
12aa0 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  onError,       /
12ab0 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49  * OE_Abort, OE_I
12ac0 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63  gnore, OE_Replac
12ad0 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f  e, or OE_None */
12ae0 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
12af0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
12b00 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
12b10 65 67 69 6e 73 20 74 68 69 73 20 73 74 61 74 65  egins this state
12b20 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
12b30 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20  *pEnd,       /* 
12b40 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f  The ")" that clo
12b50 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49  ses the CREATE I
12b60 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
12b70 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
12b80 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f  r,     /* Sort o
12b90 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20  rder of primary 
12ba0 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d  key when pList==
12bb0 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66  NULL */.  int if
12bc0 4e 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20  NotExist     /* 
12bd0 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e  Omit error if in
12be0 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
12bf0 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
12c00 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
12c10 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
12c20 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
12c30 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20  x *pIndex = 0;  
12c40 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
12c50 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20   be created */. 
12c60 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
12c70 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
12c80 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
12c90 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
12ca0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12cb0 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
12cc0 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69  zName */.  int i
12cd0 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c  , j;.  Token nul
12ce0 6c 49 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  lId;        /* F
12cf0 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e  ake token for an
12d00 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a   empty ID list *
12d10 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  /.  DbFixer sFix
12d20 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ;        /* For 
12d30 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61  assigning databa
12d40 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62  se names to pTab
12d50 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  le */.  int sort
12d60 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20  OrderMask;   /* 
12d70 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20  1 to honor DESC 
12d80 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20  in index.  0 to 
12d90 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c  ignore. */.  sql
12da0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
12db0 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62  e->db;.  Db *pDb
12dc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
12dd0 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74 61   The specific ta
12de0 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
12df0 68 65 20 69 6e 64 65 78 65 64 20 64 61 74 61 62  he indexed datab
12e00 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
12e10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
12e20 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   Index of the da
12e30 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62  tabase that is b
12e40 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a  eing written */.
12e50 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
12e60 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c   0;    /* Unqual
12e70 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
12e80 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74  e index to creat
12e90 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  e */.  struct Ex
12ea0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69  prList_item *pLi
12eb0 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c  stItem; /* For l
12ec0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73  ooping over pLis
12ed0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t */.  int nCol;
12ee0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20  .  int nExtra = 
12ef0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  0;.  char *zExtr
12f00 61 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  a;..  if( pParse
12f10 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
12f20 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e  llocFailed || IN
12f30 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
12f40 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
12f50 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
12f60 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
12f70 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
12f80 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
12f90 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  .  Return early 
12fa0 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
12fb0 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  */.  if( pTblNam
12fc0 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e!=0 ){..    /* 
12fd0 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74  Use the two-part
12fe0 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64   index name to d
12ff0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74  etermine the dat
13000 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f  abase .    ** to
13010 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   search for the 
13020 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65  table. 'Fix' the
13030 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
13040 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65  his db.    ** be
13050 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20  fore looking up 
13060 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
13070 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  /.    assert( pN
13080 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29  ame1 && pName2 )
13090 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
130a0 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
130b0 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
130c0 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
130d0 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20      if( iDb<0 ) 
130e0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
130f0 5f 69 6e 64 65 78 3b 0a 0a 23 69 66 6e 64 65 66  _index;..#ifndef
13100 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d   SQLITE_OMIT_TEM
13110 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  PDB.    /* If th
13120 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73  e index name was
13130 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68   unqualified, ch
13140 65 63 6b 20 69 66 20 74 68 65 20 74 68 65 20 74  eck if the the t
13150 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61  able.    ** is a
13160 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20   temp table. If 
13170 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  so, set the data
13180 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f  base to 1. Do no
13190 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a  t do this.    **
131a0 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67   if initialising
131b0 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65   a database sche
131c0 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ma..    */.    i
131d0 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
131e0 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  y ){.      pTab 
131f0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
13200 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
13210 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TblName);.      
13220 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e  if( pName2 && pN
13230 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54  ame2->n==0 && pT
13240 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  ab && pTab->pSch
13250 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
13260 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
13270 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20     iDb = 1;.    
13280 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
13290 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
132a0 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
132b0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e  pParse, iDb, "in
132c0 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a  dex", pName) &&.
132d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
132e0 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c  ixSrcList(&sFix,
132f0 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29   pTblName).    )
13300 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75  {.      /* Becau
13310 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63 6f  se the parser co
13320 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d  nstructs pTblNam
13330 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  e from a single 
13340 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20  identifier,.    
13350 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53    ** sqlite3FixS
13360 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72  rcList can never
13370 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   fail. */.      
13380 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d  assert(0);.    }
13390 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
133a0 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
133b0 50 61 72 73 65 2c 20 30 2c 20 70 54 62 6c 4e 61  Parse, 0, pTblNa
133c0 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
133d0 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d  .        pTblNam
133e0 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
133f0 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  e);.    if( !pTa
13400 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
13410 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69  ailed ) goto exi
13420 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13430 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
13440 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
13450 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
13460 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
13470 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30  assert( pName==0
13480 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70   );.    pTab = p
13490 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
134a0 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20  ;.    if( !pTab 
134b0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
134c0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44  te_index;.    iD
134d0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
134e0 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
134f0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  b->pSchema);.  }
13500 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
13510 62 5b 69 44 62 5d 3b 0a 0a 20 20 69 66 28 20 70  b[iDb];..  if( p
13520 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  Tab==0 || pParse
13530 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78  ->nErr ) goto ex
13540 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13550 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
13560 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
13570 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
13580 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
13590 6d 65 6d 63 6d 70 28 26 70 54 61 62 2d 3e 7a 4e  memcmp(&pTab->zN
135a0 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62  ame[7],"altertab
135b0 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20 20  _",9)!=0 ){.    
135c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
135d0 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
135e0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
135f0 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  exed", pTab->zNa
13600 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
13610 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13620 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
13630 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
13640 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
13650 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
13660 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13670 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20   "views may not 
13680 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
13690 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
136a0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
136b0 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
136c0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
136d0 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
136e0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
136f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13700 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74  sg(pParse, "virt
13710 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e  ual tables may n
13720 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
13730 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
13740 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
13750 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
13760 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
13770 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
13780 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
13790 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
137a0 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
137b0 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
137c0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
137d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
137e0 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
137f0 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
13800 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
13810 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
13820 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
13830 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
13840 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
13850 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
13860 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
13870 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
13880 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
13890 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
138a0 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
138b0 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
138c0 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
138d0 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
138e0 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
138f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
13900 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
13910 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
13920 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
13930 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
13940 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
13950 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
13960 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
13970 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
13980 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
13990 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
139a0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
139b0 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , pName);.    if
139c0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
139d0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
139e0 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
139f0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13a00 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
13a10 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
13a20 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13a30 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
13a40 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
13a50 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
13a60 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ame) ){.      go
13a70 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13a80 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
13a90 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
13aa0 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  sy ){.      if( 
13ab0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
13ac0 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
13ad0 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74  rse) ) goto exit
13ae0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13af0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
13b00 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
13b10 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20  ame, 0)!=0 ){.  
13b20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
13b30 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
13b40 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
13b50 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73  a table named %s
13b60 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
13b70 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
13b80 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
13b90 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
13ba0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
13bb0 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62  x(db, zName, pDb
13bc0 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ->zName)!=0 ){. 
13bd0 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45       if( !ifNotE
13be0 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  xist ){.        
13bf0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13c00 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25  pParse, "index %
13c10 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  s already exists
13c20 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
13c30 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78   }.      goto ex
13c40 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13c50 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
13c60 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49      int n;.    I
13c70 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  ndex *pLoop;.   
13c80 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d   for(pLoop=pTab-
13c90 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c  >pIndex, n=1; pL
13ca0 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
13cb0 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a  ->pNext, n++){}.
13cc0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
13cd0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
13ce0 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
13cf0 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a  _%s_%d", pTab->z
13d00 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66  Name, n);.    if
13d10 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
13d20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
13d30 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13d40 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
13d50 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74  k for authorizat
13d60 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ion to create an
13d70 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66   index..  */.#if
13d80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13d90 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
13da0 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
13db0 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e  r *zDb = pDb->zN
13dc0 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
13dd0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
13de0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
13df0 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
13e00 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20  E(iDb), 0, zDb) 
13e10 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
13e20 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13e30 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53  .    }.    i = S
13e40 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44  QLITE_CREATE_IND
13e50 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  EX;.    if( !OMI
13e60 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
13e70 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f  =1 ) i = SQLITE_
13e80 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
13e90 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
13ea0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
13eb0 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54  se, i, zName, pT
13ec0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
13ed0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
13ee0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13ef0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13f00 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74  f..  /* If pList
13f10 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ==0, it means th
13f20 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
13f30 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20  alled to make a 
13f40 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79  primary.  ** key
13f50 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74   out of the last
13f60 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f   column added to
13f70 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
13f80 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20   construction.. 
13f90 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20   ** So create a 
13fa0 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d  fake list to sim
13fb0 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f  ulate this..  */
13fc0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
13fd0 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20  ){.    nullId.z 
13fe0 3d 20 28 75 38 2a 29 70 54 61 62 2d 3e 61 43 6f  = (u8*)pTab->aCo
13ff0 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e  l[pTab->nCol-1].
14000 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49  zName;.    nullI
14010 64 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  d.n = sqlite3Str
14020 6c 65 6e 33 30 28 28 63 68 61 72 2a 29 6e 75 6c  len30((char*)nul
14030 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 6e 75 6c 6c  lId.z);.    null
14040 49 64 2e 71 75 6f 74 65 64 20 3d 20 30 3b 0a 20  Id.quoted = 0;. 
14050 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
14060 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
14070 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26  (pParse, 0, 0, &
14080 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28  nullId);.    if(
14090 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
140a0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
140b0 65 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  ex;.    pList->a
140c0 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
140d0 28 75 38 29 73 6f 72 74 4f 72 64 65 72 3b 0a 20  (u8)sortOrder;. 
140e0 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20   }..  /* Figure 
140f0 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74  out how many byt
14100 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65 20  es of space are 
14110 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72  required to stor
14120 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a  e explicitly.  *
14130 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c  * specified coll
14140 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
14150 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ames..  */.  for
14160 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
14170 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
14180 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20  Expr *pExpr;.   
14190 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
141a0 0a 20 20 20 20 69 66 28 20 28 70 45 78 70 72 20  .    if( (pExpr 
141b0 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
141c0 78 70 72 29 21 3d 30 20 26 26 20 28 70 43 6f 6c  xpr)!=0 && (pCol
141d0 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  l = pExpr->pColl
141e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45  )!=0 ){.      nE
141f0 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c  xtra += (1 + sql
14200 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f  ite3Strlen30(pCo
14210 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ll->zName));.   
14220 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20   }.  }..  /* .  
14230 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  ** Allocate the 
14240 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  index structure.
14250 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d   .  */.  nName =
14260 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
14270 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 43 6f 6c 20  (zName);.  nCol 
14280 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
14290 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
142a0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
142b0 62 2c 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  b, .      sizeof
142c0 28 49 6e 64 65 78 29 20 2b 20 20 20 20 20 20 20  (Index) +       
142d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
142e0 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20  structure  */.  
142f0 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a      sizeof(int)*
14300 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20  nCol +          
14310 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75   /* Index.aiColu
14320 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69  mn   */.      si
14330 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b  zeof(int)*(nCol+
14340 31 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 49 6e  1) +       /* In
14350 64 65 78 2e 61 69 52 6f 77 45 73 74 20 20 20 2a  dex.aiRowEst   *
14360 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 63  /.      sizeof(c
14370 68 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20  har *)*nCol +   
14380 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a       /* Index.az
14390 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20  Coll     */.    
143a0 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f    sizeof(u8)*nCo
143b0 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f  l +            /
143c0 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64  * Index.aSortOrd
143d0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61 6d  er */.      nNam
143e0 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20  e + 1 +         
143f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
14400 78 2e 7a 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0a  x.zName      */.
14410 20 20 20 20 20 20 6e 45 78 74 72 61 20 20 20 20        nExtra    
14420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14430 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20     /* Collation 
14440 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 20 2a  sequence names *
14450 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  /.  );.  if( db-
14460 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
14470 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
14480 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
14490 0a 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  .  pIndex->azCol
144a0 6c 20 3d 20 28 63 68 61 72 2a 2a 29 28 26 70 49  l = (char**)(&pI
144b0 6e 64 65 78 5b 31 5d 29 3b 0a 20 20 70 49 6e 64  ndex[1]);.  pInd
144c0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  ex->aiColumn = (
144d0 69 6e 74 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e  int *)(&pIndex->
144e0 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20  azColl[nCol]);. 
144f0 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73   pIndex->aiRowEs
14500 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 2a 29  t = (unsigned *)
14510 28 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  (&pIndex->aiColu
14520 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e  mn[nCol]);.  pIn
14530 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  dex->aSortOrder 
14540 3d 20 28 75 38 20 2a 29 28 26 70 49 6e 64 65 78  = (u8 *)(&pIndex
14550 2d 3e 61 69 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b  ->aiRowEst[nCol+
14560 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a  1]);.  pIndex->z
14570 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 28  Name = (char *)(
14580 26 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72  &pIndex->aSortOr
14590 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45  der[nCol]);.  zE
145a0 78 74 72 61 20 3d 20 28 63 68 61 72 20 2a 29 28  xtra = (char *)(
145b0 26 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e  &pIndex->zName[n
145c0 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20 6d 65 6d 63  Name+1]);.  memc
145d0 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
145e0 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31  , zName, nName+1
145f0 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61  );.  pIndex->pTa
14600 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49  ble = pTab;.  pI
14610 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  ndex->nColumn = 
14620 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
14630 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
14640 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
14650 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
14660 65 78 20 3d 20 28 75 38 29 28 70 4e 61 6d 65 3d  ex = (u8)(pName=
14670 3d 30 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  =0);.  pIndex->p
14680 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
14690 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 0a  [iDb].pSchema;..
146a0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
146b0 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68  e if we should h
146c0 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73  onor DESC reques
146d0 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75  ts on index colu
146e0 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  mns.  */.  if( p
146f0 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c  Db->pSchema->fil
14700 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20  e_format>=4 ){. 
14710 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b     sortOrderMask
14720 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f   = -1;   /* Hono
14730 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73  r DESC */.  }els
14740 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  e{.    sortOrder
14750 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Mask = 0;    /* 
14760 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20  Ignore DESC */. 
14770 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68   }..  /* Scan th
14780 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63  e names of the c
14790 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61  olumns of the ta
147a0 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
147b0 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20  d and.  ** load 
147c0 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63  the column indic
147d0 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65  es into the Inde
147e0 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  x structure.  Re
147f0 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20  port an error.  
14800 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  ** if any column
14810 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   is not found.. 
14820 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
14830 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  ListItem=pList->
14840 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  a; i<pList->nExp
14850 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65  r; i++, pListIte
14860 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  m++){.    const 
14870 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d  char *zColName =
14880 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d   pListItem->zNam
14890 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70  e;.    Column *p
148a0 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20  TabCol;.    int 
148b0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
148c0 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  er;.    char *zC
148d0 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
148e0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
148f0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
14900 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  e */..    for(j=
14910 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  0, pTabCol=pTab-
14920 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
14930 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f  Col; j++, pTabCo
14940 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
14950 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
14960 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c  ColName, pTabCol
14970 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ->zName)==0 ) br
14980 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
14990 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
149a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
149b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
149c0 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
149d0 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20  no column named 
149e0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
149f0 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61  b->zName, zColNa
14a00 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
14a10 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
14a20 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  x;.    }.    /* 
14a30 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73  TODO:  Add a tes
14a40 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
14a50 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  hat the same col
14a60 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64  umn is not named
14a70 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61  .    ** more tha
14a80 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68  n once within th
14a90 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f  e same index.  O
14aa0 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 69 6e  nly the first in
14ab0 73 74 61 6e 63 65 20 6f 66 0a 20 20 20 20 2a 2a  stance of.    **
14ac0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c   the column will
14ad0 20 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79   ever be used by
14ae0 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20   the optimizer. 
14af0 20 4e 6f 74 65 20 74 68 61 74 20 75 73 69 6e 67   Note that using
14b00 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 61 6d 65   the.    ** same
14b10 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68 61   column more tha
14b20 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62 65  n once cannot be
14b30 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
14b40 65 20 74 68 61 74 20 77 6f 75 6c 64 20 0a 20 20  e that would .  
14b50 20 20 2a 2a 20 62 72 65 61 6b 20 62 61 63 6b 77    ** break backw
14b60 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
14b70 74 79 20 2d 20 69 74 20 6e 65 65 64 73 20 74 6f  ty - it needs to
14b80 20 62 65 20 61 20 77 61 72 6e 69 6e 67 2e 0a 20   be a warning.. 
14b90 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65 78     */.    pIndex
14ba0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
14bb0 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  j;.    if( pList
14bc0 49 74 65 6d 2d 3e 70 45 78 70 72 20 26 26 20 70  Item->pExpr && p
14bd0 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
14be0 3e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >pColl ){.      
14bf0 61 73 73 65 72 74 28 20 70 4c 69 73 74 49 74 65  assert( pListIte
14c00 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20  m->pExpr->pColl 
14c10 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  );.      zColl =
14c20 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20 73   zExtra;.      s
14c30 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
14c40 6e 45 78 74 72 61 2c 20 7a 45 78 74 72 61 2c 20  nExtra, zExtra, 
14c50 22 25 73 22 2c 20 70 4c 69 73 74 49 74 65 6d 2d  "%s", pListItem-
14c60 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a  >pExpr->pColl->z
14c70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 45 78  Name);.      zEx
14c80 74 72 61 20 2b 3d 20 28 73 71 6c 69 74 65 33 53  tra += (sqlite3S
14c90 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b  trlen30(zColl) +
14ca0 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
14cb0 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54        zColl = pT
14cc0 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  ab->aCol[j].zCol
14cd0 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43  l;.      if( !zC
14ce0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  oll ){.        z
14cf0 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
14d00 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Coll->zName;.   
14d10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
14d20 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
14d30 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63  y && !sqlite3Loc
14d40 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
14d50 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
14d60 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
14d70 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
14d80 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  .    pIndex->azC
14d90 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a  oll[i] = zColl;.
14da0 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72      requestedSor
14db0 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74  tOrder = pListIt
14dc0 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20  em->sortOrder & 
14dd0 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20  sortOrderMask;. 
14de0 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
14df0 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72  Order[i] = (u8)r
14e00 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
14e10 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  r;.  }.  sqlite3
14e20 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49  DefaultRowEst(pI
14e30 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54  ndex);..  if( pT
14e40 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
14e50 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
14e60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
14e70 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
14e80 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61  create an automa
14e90 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20  tic index as a. 
14ea0 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20     ** result of 
14eb0 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
14ec0 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f   UNIQUE clause o
14ed0 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  n a column defin
14ee0 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a  ition, or.    **
14ef0 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
14f00 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
14f10 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f  following the co
14f20 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73  lumn definitions
14f30 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e  ..    ** i.e. on
14f40 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e of:.    **.   
14f50 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
14f60 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59   t(x PRIMARY KEY
14f70 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45  , y);.    ** CRE
14f80 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79  ATE TABLE t(x, y
14f90 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b  , UNIQUE(x, y));
14fa0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
14fb0 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b  ither way, check
14fc0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74   to see if the t
14fd0 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
14fe0 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20   such an index. 
14ff0 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f  If.    ** so, do
15000 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74  n't bother creat
15010 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68  ing this one. Th
15020 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20  is only applies 
15030 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61  to.    ** automa
15040 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
15050 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63  indices. Users c
15060 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69  an do as they wi
15070 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65  sh with.    ** e
15080 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e  xplicit indices.
15090 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65  .    */.    Inde
150a0 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
150b0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
150c0 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
150d0 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
150e0 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
150f0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e  assert( pIdx->on
15100 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
15110 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15120 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  pIdx->autoIndex 
15130 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15140 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
15150 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20  !=OE_None );..  
15160 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
15170 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e  olumn!=pIndex->n
15180 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
15190 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  e;.      for(k=0
151a0 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; k<pIdx->nColum
151b0 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; k++){.       
151c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 20   const char *z1 
151d0 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b  = pIdx->azColl[k
151e0 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ];.        const
151f0 20 63 68 61 72 20 2a 7a 32 20 3d 20 70 49 6e 64   char *z2 = pInd
15200 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  ex->azColl[k];. 
15210 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
15220 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49  >aiColumn[k]!=pI
15230 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  ndex->aiColumn[k
15240 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
15250 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53 6f     if( pIdx->aSo
15260 72 74 4f 72 64 65 72 5b 6b 5d 21 3d 70 49 6e 64  rtOrder[k]!=pInd
15270 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b  ex->aSortOrder[k
15280 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
15290 20 20 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26     if( z1!=z2 &&
152a0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
152b0 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b  z1, z2) ) break;
152c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
152d0 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  f( k==pIdx->nCol
152e0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69  umn ){.        i
152f0 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
15300 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  !=pIndex->onErro
15310 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
15320 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  * This constrain
15330 74 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61  t creates the sa
15340 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72  me index as a pr
15350 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20  evious.         
15360 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73   ** constraint s
15370 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65  pecified somewhe
15380 72 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  re in the CREATE
15390 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
153a0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48  ..          ** H
153b0 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f  owever the ON CO
153c0 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61  NFLICT clauses a
153d0 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66  re different. If
153e0 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20   both this .    
153f0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
15400 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76  int and the prev
15410 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20  ious equivalent 
15420 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20  constraint have 
15430 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20  explicit.       
15440 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43     ** ON CONFLIC
15450 54 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69  T clauses this i
15460 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65  s an error. Othe
15470 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20  rwise, use the. 
15480 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c           ** expl
15490 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64  icitly specified
154a0 20 62 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74   behaviour for t
154b0 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  he index..      
154c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
154d0 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45   if( !(pIdx->onE
154e0 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
154f0 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72   || pIndex->onEr
15500 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29  ror==OE_Default)
15510 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15520 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15530 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
15540 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69           "confli
15550 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43  cting ON CONFLIC
15560 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66  T clauses specif
15570 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ied", 0);.      
15580 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15590 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
155a0 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b  r==OE_Default ){
155b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
155c0 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e  x->onError = pIn
155d0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20  dex->onError;.  
155e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
155f0 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f    }.        goto
15600 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
15610 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
15620 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  }.  }..  /* Link
15630 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73   the new Index s
15640 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
15650 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65  table and to the
15660 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d   other.  ** in-m
15670 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73  emory database s
15680 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f  tructures. .  */
15690 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
156a0 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65  busy ){.    Inde
156b0 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71  x *p;.    p = sq
156c0 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
156d0 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61  &pIndex->pSchema
156e0 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20  ->idxHash, .    
156f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15700 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
15710 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ame, sqlite3Strl
15720 65 6e 33 30 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  en30(pIndex->zNa
15730 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me),.           
15740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15750 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
15760 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
15770 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
15780 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
15790 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
157a0 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
157b0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
157c0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
157d0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
157e0 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
157f0 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
15800 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54  nges;.    if( pT
15810 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
15820 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
15830 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
15840 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  um;.    }.  }.. 
15850 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
15860 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68  nit.busy is 0 th
15870 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e  en create the in
15880 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68  dex on disk.  Th
15890 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73  is.  ** involves
158a0 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64   writing the ind
158b0 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74  ex into the mast
158c0 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c  er table and fil
158d0 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a  ling in the.  **
158e0 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
158f0 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f  current table co
15900 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ntents..  **.  *
15910 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  * The db->init.b
15920 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68  usy is 0 when th
15930 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74  e user first ent
15940 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44  ers a CREATE IND
15950 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  EX .  ** command
15960 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  .  db->init.busy
15970 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74   is 1 when a dat
15980 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
15990 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45  and .  ** CREATE
159a0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
159b0 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f  s are read out o
159c0 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  f the master tab
159d0 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65  le.  In.  ** the
159e0 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65   latter case the
159f0 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
15a00 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77  xists on disk, w
15a10 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a  hich is why.  **
15a20 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
15a30 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20  o recreate it.. 
15a40 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c   **.  ** If pTbl
15a50 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
15a60 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
15a70 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72  enerated as a pr
15a80 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f  imary key.  ** o
15a90 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
15aa0 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20  int of a CREATE 
15ab0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
15ac0 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
15ad0 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
15ae0 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
15af0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
15b00 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
15b10 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
15b20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
15b30 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
15b40 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69  else if( db->ini
15b50 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
15b60 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
15b70 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69  ar *zStmt;.    i
15b80 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  nt iMem = ++pPar
15b90 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76  se->nMem;..    v
15ba0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
15bb0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
15bc0 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65  f( v==0 ) goto e
15bd0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
15be0 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  ;...    /* Creat
15bf0 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  e the rootpage f
15c00 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  or the index.   
15c10 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
15c20 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
15c30 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
15c40 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
15c50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15c60 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62  CreateIndex, iDb
15c70 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  , iMem);..    /*
15c80 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70   Gather the comp
15c90 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
15ca0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
15cb0 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20  atement into.   
15cc0 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61   ** the zStmt va
15cd0 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20  riable.    */.  
15ce0 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20    if( pStart && 
15cf0 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pEnd ){.      /*
15d00 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77   A named index w
15d10 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ith an explicit 
15d20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
15d30 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
15d40 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
15d50 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41  Printf(db, "CREA
15d60 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22  TE%s INDEX %.*s"
15d70 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f  ,.        onErro
15d80 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20  r==OE_None ? "" 
15d90 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a 20 20 20  : " UNIQUE",.   
15da0 20 20 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20 70       pEnd->z - p
15db0 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20  Name->z + 1,.   
15dc0 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a       pName->z);.
15dd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15de0 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63   /* An automatic
15df0 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62   index created b
15e00 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  y a PRIMARY KEY 
15e10 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
15e20 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  aint */.      /*
15e30 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
15e40 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a  MPrintf(""); */.
15e50 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b        zStmt = 0;
15e60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
15e70 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73  dd an entry in s
15e80 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72  qlite_master for
15e90 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20   this index.    
15ea0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
15eb0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
15ec0 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45  , .        "INSE
15ed0 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41  RT INTO %Q.%s VA
15ee0 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c  LUES('index',%Q,
15ef0 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20  %Q,#%d,%Q);",.  
15f00 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
15f10 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
15f20 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
15f30 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
15f40 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  me,.        pTab
15f50 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
15f60 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a   iMem,.        z
15f70 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Stmt.    );.    
15f80 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
15f90 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f  , zStmt);..    /
15fa0 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78  * Fill the index
15fb0 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72   with data and r
15fc0 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d  eparse the schem
15fd0 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78  a. Code an OP_Ex
15fe0 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69  pire.    ** to i
15ff0 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
16000 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  e-compiled state
16010 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ments..    */.  
16020 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29    if( pTblName )
16030 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
16040 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
16050 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29  e, pIndex, iMem)
16060 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
16070 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
16080 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
16090 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
160a0 34 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  4(v, OP_ParseSch
160b0 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a  ema, iDb, 0, 0,.
160c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
160d0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d  MPrintf(db, "nam
160e0 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d  e='%q'", pIndex-
160f0 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41  >zName), P4_DYNA
16100 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  MIC);.      sqli
16110 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16120 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 29 3b 0a   OP_Expire, 0);.
16130 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
16140 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69  When adding an i
16150 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74  ndex to the list
16160 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20   of indices for 
16170 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20  a table, make.  
16180 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69  ** sure all indi
16190 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52  ces labeled OE_R
161a0 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65  eplace come afte
161b0 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65  r all those labe
161c0 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f  led.  ** OE_Igno
161d0 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  re.  This is nec
161e0 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63  essary for the c
161f0 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
16200 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20   of UPDATE.  ** 
16210 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f  and INSERT..  */
16220 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
16230 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65  busy || pTblName
16240 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ==0 ){.    if( o
16250 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
16260 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64  ce || pTab->pInd
16270 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  ex==0.         |
16280 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e  | pTab->pIndex->
16290 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
162a0 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ace){.      pInd
162b0 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62  ex->pNext = pTab
162c0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
162d0 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70  pTab->pIndex = p
162e0 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65  Index;.    }else
162f0 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
16300 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49  Other = pTab->pI
16310 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c  ndex;.      whil
16320 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  e( pOther->pNext
16330 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78   && pOther->pNex
16340 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  t->onError!=OE_R
16350 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eplace ){.      
16360 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65    pOther = pOthe
16370 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
16380 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  }.      pIndex->
16390 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e  pNext = pOther->
163a0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74  pNext;.      pOt
163b0 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  her->pNext = pIn
163c0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
163d0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Index = 0;.  }..
163e0 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65    /* Clean up be
163f0 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
16400 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
16410 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  x:.  if( pIndex 
16420 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
16430 72 65 65 28 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c  ree(pIndex->zCol
16440 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Aff);.    sqlite
16450 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e 64  3DbFree(db, pInd
16460 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ex);.  }.  sqlit
16470 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
16480 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73  (db, pList);.  s
16490 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
164a0 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65  ete(db, pTblName
164b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
164c0 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
164d0 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
164e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
164f0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
16500 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d   file format num
16510 62 65 72 20 69 73 20 61 74 20 6c 65 61 73 74 20  ber is at least 
16520 6d 69 6e 46 6f 72 6d 61 74 2e 0a 2a 2a 20 54 68  minFormat..** Th
16530 65 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65  e generated code
16540 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74   will increase t
16550 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e  he file format n
16560 75 6d 62 65 72 20 69 66 20 6e 65 63 65 73 73 61  umber if necessa
16570 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ry..*/.void sqli
16580 74 65 33 4d 69 6e 69 6d 75 6d 46 69 6c 65 46 6f  te3MinimumFileFo
16590 72 6d 61 74 28 50 61 72 73 65 20 2a 70 50 61 72  rmat(Parse *pPar
165a0 73 65 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  se, int iDb, int
165b0 20 6d 69 6e 46 6f 72 6d 61 74 29 7b 0a 20 20 56   minFormat){.  V
165c0 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71  dbe *v;.  v = sq
165d0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
165e0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
165f0 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71  .    int r1 = sq
16600 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
16610 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 6e 74  pParse);.    int
16620 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
16630 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
16640 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20  .    int j1;.   
16650 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16660 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f  p3(v, OP_ReadCoo
16670 6b 69 65 2c 20 69 44 62 2c 20 72 31 2c 20 31 29  kie, iDb, r1, 1)
16680 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16690 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
166a0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
166b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
166c0 49 6e 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72 6d  Integer, minForm
166d0 61 74 2c 20 72 32 29 3b 0a 20 20 20 20 6a 31 20  at, r2);.    j1 
166e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
166f0 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c 20 72 32  Op3(v, OP_Ge, r2
16700 2c 20 30 2c 20 72 31 29 3b 0a 20 20 20 20 73 71  , 0, r1);.    sq
16710 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16720 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
16730 20 69 44 62 2c 20 31 2c 20 72 32 29 3b 0a 20 20   iDb, 1, r2);.  
16740 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
16750 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
16760 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
16770 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
16780 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
16790 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
167a0 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 7d 0a  Parse, r2);.  }.
167b0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68  }../*.** Fill th
167c0 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74  e Index.aiRowEst
167d0 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65  [] array with de
167e0 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f  fault informatio
167f0 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  n - information.
16800 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68  ** to be used wh
16810 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72  en we have not r
16820 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63  un the ANALYZE c
16830 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69  ommand..**.** ai
16840 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70  RowEst[0] is sup
16850 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  pose to contain 
16860 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
16870 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  ements in the in
16880 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65  dex..** Since we
16890 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75   do not know, gu
168a0 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20  ess 1 million.  
168b0 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61  aiRowEst[1] is a
168c0 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
168d0 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
168e0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
168f0 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
16900 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65  particular value
16910 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   of the.** first
16920 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
16930 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b  ndex.  aiRowEst[
16940 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  2] is an estimat
16950 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a  e of the number.
16960 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  ** of rows that 
16970 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
16980 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f  ular combiniatio
16990 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32  n of the first 2
169a0 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74   columns.** of t
169b0 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73  he index.  And s
169c0 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73  o forth.  It mus
169d0 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  t always be the 
169e0 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20  case that.*.**  
169f0 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
16a00 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e  t[N]<=aiRowEst[N
16a10 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  -1].**          
16a20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a   aiRowEst[N]>=1.
16a30 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d  **.** Apart from
16a40 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c   that, we have l
16a50 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62  ittle to go on b
16a60 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e  esides intuition
16a70 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69   as to.** how ai
16a80 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20  RowEst[] should 
16a90 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
16aa0 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e   The numbers gen
16ab0 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61  erated here.** a
16ac0 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69  re based on typi
16ad0 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64  cal values found
16ae0 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63   in actual indic
16af0 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
16b00 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
16b10 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
16b20 20 75 6e 73 69 67 6e 65 64 20 2a 61 20 3d 20 70   unsigned *a = p
16b30 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20  Idx->aiRowEst;. 
16b40 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
16b50 28 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d  ( a!=0 );.  a[0]
16b60 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 66 6f   = 1000000;.  fo
16b70 72 28 69 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  r(i=pIdx->nColum
16b80 6e 3b 20 69 3e 3d 35 3b 20 69 2d 2d 29 7b 0a 20  n; i>=5; i--){. 
16b90 20 20 20 61 5b 69 5d 20 3d 20 35 3b 0a 20 20 7d     a[i] = 5;.  }
16ba0 0a 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 29  .  while( i>=1 )
16bb0 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 31 31 20  {.    a[i] = 11 
16bc0 2d 20 69 3b 0a 20 20 20 20 69 2d 2d 3b 0a 20 20  - i;.    i--;.  
16bd0 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e  }.  if( pIdx->on
16be0 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
16bf0 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43  {.    a[pIdx->nC
16c00 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a  olumn] = 1;.  }.
16c10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
16c20 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20  utine will drop 
16c30 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65  an existing name
16c40 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72  d index.  This r
16c50 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d  outine.** implem
16c60 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e  ents the DROP IN
16c70 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  DEX statement..*
16c80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
16c90 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  opIndex(Parse *p
16ca0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
16cb0 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69  pName, int ifExi
16cc0 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  sts){.  Index *p
16cd0 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76  Index;.  Vdbe *v
16ce0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
16cf0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
16d00 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20  int iDb;..  if( 
16d10 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
16d20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
16d30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
16d40 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
16d50 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  }.  assert( pNam
16d60 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
16d70 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
16d80 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
16d90 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
16da0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
16db0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  ndex;.  }.  pInd
16dc0 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
16dd0 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d  Index(db, pName-
16de0 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61  >a[0].zName, pNa
16df0 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
16e00 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  se);.  if( pInde
16e10 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  x==0 ){.    if( 
16e20 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20  !ifExists ){.   
16e30 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
16e40 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
16e50 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20  uch index: %S", 
16e60 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  pName, 0);.    }
16e70 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
16e80 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
16e90 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
16ea0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
16eb0 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e  ( pIndex->autoIn
16ec0 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
16ed0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
16ee0 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69  e, "index associ
16ef0 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45  ated with UNIQUE
16f00 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49   ".      "or PRI
16f10 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
16f20 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72  int cannot be dr
16f30 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  opped", 0);.    
16f40 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
16f50 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20  ndex;.  }.  iDb 
16f60 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
16f70 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
16f80 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66  x->pSchema);.#if
16f90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16fa0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
16fb0 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20   {.    int code 
16fc0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  = SQLITE_DROP_IN
16fd0 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  DEX;.    Table *
16fe0 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
16ff0 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Table;.    const
17000 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
17010 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
17020 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
17030 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
17040 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69  ABLE(iDb);.    i
17050 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
17060 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
17070 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
17080 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
17090 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
170a0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
170b0 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
170c0 44 42 20 26 26 20 69 44 62 20 29 20 63 6f 64 65  DB && iDb ) code
170d0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
170e0 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
170f0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
17100 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
17110 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
17120 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
17130 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
17140 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
17150 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
17160 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
17170 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
17180 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
17190 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
171a0 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
171b0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
171c0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
171d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
171e0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
171f0 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
17200 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
17210 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
17220 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
17230 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
17240 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20  name=%Q",.      
17250 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
17260 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
17270 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 70  E(iDb),.       p
17280 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Index->zName.   
17290 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
172a0 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
172b0 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c   "sqlite_stat1",
172c0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
172d0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ame) ){.      sq
172e0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
172f0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
17300 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
17310 2e 73 71 6c 69 74 65 5f 73 74 61 74 31 20 57 48  .sqlite_stat1 WH
17320 45 52 45 20 69 64 78 3d 25 51 22 2c 0a 20 20 20  ERE idx=%Q",.   
17330 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
17340 5d 2e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d  ].zName, pIndex-
17350 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
17360 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
17370 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
17380 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
17390 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
173a0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e  pParse, pIndex->
173b0 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
173c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
173d0 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65  4(v, OP_DropInde
173e0 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49  x, iDb, 0, 0, pI
173f0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
17400 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
17410 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33  index:.  sqlite3
17420 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
17430 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , pName);.}../*.
17440 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61 20 70  ** pArray is a p
17450 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72  ointer to an arr
17460 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
17470 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74  Each object in t
17480 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73  he.** array is s
17490 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20  zEntry bytes in 
174a0 73 69 7a 65 2e 20 20 54 68 69 73 20 72 6f 75 74  size.  This rout
174b0 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ine allocates a 
174c0 6e 65 77 0a 2a 2a 20 6f 62 6a 65 63 74 20 6f 6e  new.** object on
174d0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
174e0 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e  array..**.** *pn
174f0 45 6e 74 72 79 20 69 73 20 74 68 65 20 6e 75 6d  Entry is the num
17500 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 61  ber of entries a
17510 6c 72 65 61 64 79 20 69 6e 20 75 73 65 2e 20 20  lready in use.  
17520 2a 70 6e 41 6c 6c 6f 63 20 69 73 0a 2a 2a 20 74  *pnAlloc is.** t
17530 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  he previously al
17540 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
17550 74 68 65 20 61 72 72 61 79 2e 20 20 69 6e 69 74  the array.  init
17560 53 69 7a 65 20 69 73 20 74 68 65 0a 2a 2a 20 73  Size is the.** s
17570 75 67 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c  uggested initial
17580 20 61 72 72 61 79 20 73 69 7a 65 20 61 6c 6c 6f   array size allo
17590 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
175a0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
175b0 65 77 20 65 6e 74 72 79 20 69 73 20 72 65 74 75  ew entry is retu
175c0 72 6e 65 64 20 69 6e 20 2a 70 49 64 78 2e 0a 2a  rned in *pIdx..*
175d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
175e0 65 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  e returns a poin
175f0 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79  ter to the array
17600 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 54 68   of objects.  Th
17610 69 73 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 74  is.** might be t
17620 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70  he same as the p
17630 41 72 72 61 79 20 70 61 72 61 6d 65 74 65 72 20  Array parameter 
17640 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  or it might be a
17650 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 70 6f   different.** po
17660 69 6e 74 65 72 20 69 66 20 74 68 65 20 61 72 72  inter if the arr
17670 61 79 20 77 61 73 20 72 65 73 69 7a 65 64 2e 0a  ay was resized..
17680 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
17690 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
176a0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
176b0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
176c0 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
176d0 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
176e0 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c  .  void *pArray,
176f0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
17700 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74   objects.  Might
17710 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20   be reallocated 
17720 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79  */.  int szEntry
17730 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  ,      /* Size o
17740 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  f each object in
17750 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20   the array */.  
17760 69 6e 74 20 69 6e 69 74 53 69 7a 65 2c 20 20 20  int initSize,   
17770 20 20 2f 2a 20 53 75 67 67 65 73 74 65 64 20 69    /* Suggested i
17780 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69 6f  nitial allocatio
17790 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a  n, in elements *
177a0 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79  /.  int *pnEntry
177b0 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
177c0 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65  of objects curre
177d0 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20  ntly in use */. 
177e0 20 69 6e 74 20 2a 70 6e 41 6c 6c 6f 63 2c 20 20   int *pnAlloc,  
177f0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
17800 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ze of the alloca
17810 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74  tion, in element
17820 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78  s */.  int *pIdx
17830 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
17840 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  e the index of a
17850 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a   new slot here *
17860 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  /.){.  char *z;.
17870 20 20 69 66 28 20 2a 70 6e 45 6e 74 72 79 20 3e    if( *pnEntry >
17880 3d 20 2a 70 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  = *pnAlloc ){.  
17890 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20    void *pNew;.  
178a0 20 20 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20    int newSize;. 
178b0 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 28 2a 70     newSize = (*p
178c0 6e 41 6c 6c 6f 63 29 2a 32 20 2b 20 69 6e 69 74  nAlloc)*2 + init
178d0 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 20 3d  Size;.    pNew =
178e0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
178f0 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20 6e 65  c(db, pArray, ne
17900 77 53 69 7a 65 2a 73 7a 45 6e 74 72 79 29 3b 0a  wSize*szEntry);.
17910 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
17920 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d  ){.      *pIdx =
17930 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
17940 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a  n pArray;.    }.
17950 20 20 20 20 2a 70 6e 41 6c 6c 6f 63 20 3d 20 73      *pnAlloc = s
17960 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
17970 7a 65 28 64 62 2c 20 70 4e 65 77 29 2f 73 7a 45  ze(db, pNew)/szE
17980 6e 74 72 79 3b 0a 20 20 20 20 70 41 72 72 61 79  ntry;.    pArray
17990 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a   = pNew;.  }.  z
179a0 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79   = (char*)pArray
179b0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 2a 70  ;.  memset(&z[*p
179c0 6e 45 6e 74 72 79 20 2a 20 73 7a 45 6e 74 72 79  nEntry * szEntry
179d0 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a  ], 0, szEntry);.
179e0 20 20 2a 70 49 64 78 20 3d 20 2a 70 6e 45 6e 74    *pIdx = *pnEnt
179f0 72 79 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79  ry;.  ++*pnEntry
17a00 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61  ;.  return pArra
17a10 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  y;.}../*.** Appe
17a20 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  nd a new element
17a30 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64   to the given Id
17a40 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
17a50 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a  new IdList if.**
17a60 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20   need be..**.** 
17a70 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20  A new IdList is 
17a80 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
17a90 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
17aa0 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a  ils..*/.IdList *
17ab0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
17ac0 65 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  end(sqlite3 *db,
17ad0 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20   IdList *pList, 
17ae0 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
17af0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
17b00 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
17b10 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
17b20 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
17b30 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b  izeof(IdList) );
17b40 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
17b50 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
17b60 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
17b70 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  = 0;.  }.  pList
17b80 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72  ->a = sqlite3Arr
17b90 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
17ba0 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73    db,.      pLis
17bb0 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65  t->a,.      size
17bc0 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c  of(pList->a[0]),
17bd0 0a 20 20 20 20 20 20 35 2c 0a 20 20 20 20 20 20  .      5,.      
17be0 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20  &pList->nId,.   
17bf0 20 20 20 26 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f     &pList->nAllo
17c00 63 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b  c,.      &i.  );
17c10 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20  .  if( i<0 ){.  
17c20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
17c30 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
17c40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
17c50 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69    }.  pList->a[i
17c60 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
17c70 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
17c80 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65  b, pToken);.  re
17c90 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
17ca0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49  *.** Delete an I
17cb0 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dList..*/.void s
17cc0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
17cd0 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
17ce0 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
17cf0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
17d00 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
17d10 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
17d20 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
17d30 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
17d40 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  ee(db, pList->a[
17d50 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
17d60 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
17d70 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  b, pList->a);.  
17d80 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
17d90 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pList);.}../*.
17da0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
17db0 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20  dex in pList of 
17dc0 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e  the identifier n
17dd0 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72  amed zId.  Retur
17de0 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66  n -1.** if not f
17df0 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
17e00 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
17e10 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63  IdList *pList, c
17e20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
17e30 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
17e40 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
17e50 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d  urn -1;.  for(i=
17e60 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
17e70 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
17e80 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
17e90 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
17ea0 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74   zName)==0 ) ret
17eb0 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
17ec0 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
17ed0 20 45 78 70 61 6e 64 20 74 68 65 20 73 70 61 63   Expand the spac
17ee0 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
17ef0 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73  the given SrcLis
17f00 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63  t object by.** c
17f10 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e  reating nExtra n
17f20 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69  ew slots beginni
17f30 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20 20 69  ng at iStart.  i
17f40 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61  Start is zero ba
17f50 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74  sed..** New slot
17f60 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  s are zeroed..**
17f70 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
17f80 20 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69   suppose a SrcLi
17f90 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e  st initially con
17fa0 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65  tains two entrie
17fb0 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70  s: A,B..** To ap
17fc0 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69  pend 3 new entri
17fd0 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c  es onto the end,
17fe0 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   do this:.**.** 
17ff0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
18000 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72  tEnlarge(db, pSr
18010 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a  clist, 3, 2);.**
18020 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63 61  .** After the ca
18030 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c  ll above it woul
18040 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42  d contain:  A, B
18050 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e  , nil, nil, nil.
18060 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61 72  .** If the iStar
18070 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62  t argument had b
18080 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66  een 1 instead of
18090 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73   2, then the res
180a0 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76  ult.** would hav
180b0 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c  e been:  A, nil,
180c0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54   nil, nil, B.  T
180d0 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65  o prepend the ne
180e0 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20  w slots,.** the 
180f0 69 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75  iStart value wou
18100 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 72 65  ld be 0.  The re
18110 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a  sult then would.
18120 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c  ** be: nil, nil,
18130 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a   nil, A, B..**.*
18140 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
18150 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 74  location fails t
18160 68 65 20 53 72 63 4c 69 73 74 20 69 73 20 75 6e  he SrcList is un
18170 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a  changed.  The.**
18180 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
18190 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65 20 73  d flag will be s
181a0 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53  et to true..*/.S
181b0 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
181c0 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20  rcListEnlarge(. 
181d0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
181e0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
181f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  connection to no
18200 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f  tify of OOM erro
18210 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  rs */.  SrcList 
18220 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68  *pSrc,     /* Th
18230 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20  e SrcList to be 
18240 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e  enlarged */.  in
18250 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
18260 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
18270 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74  w slots to add t
18280 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20  o pSrc->a[] */. 
18290 20 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20   int iStart     
182a0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
182b0 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72  pSrc->a[] of fir
182c0 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29  st new slot */.)
182d0 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
182e0 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
182f0 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61   on calling para
18300 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65  meters */.  asse
18310 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b  rt( iStart>=0 );
18320 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72  .  assert( nExtr
18330 61 3e 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 53  a>=1 );.  if( pS
18340 72 63 3d 3d 30 20 7c 7c 20 69 53 74 61 72 74 3e  rc==0 || iStart>
18350 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  pSrc->nSrc ){.  
18360 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
18370 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
18380 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20    return pSrc;. 
18390 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
183a0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61  e additional spa
183b0 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  ce if needed */.
183c0 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
183d0 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41  +nExtra>pSrc->nA
183e0 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
183f0 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  ist *pNew;.    i
18400 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63  nt nAlloc = pSrc
18410 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20  ->nSrc+nExtra;. 
18420 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20     int nGot;.   
18430 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
18440 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72  bRealloc(db, pSr
18450 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
18460 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20    sizeof(*pSrc) 
18470 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a  + (nAlloc-1)*siz
18480 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20  eof(pSrc->a[0]) 
18490 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
184a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
184b0 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
184c0 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
184d0 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d  turn pSrc;.    }
184e0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77  .    pSrc = pNew
184f0 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71  ;.    nGot = (sq
18500 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
18510 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69  e(db, pNew) - si
18520 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a  zeof(*pSrc))/siz
18530 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b  eof(pSrc->a[0])+
18540 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c  1;.    pSrc->nAl
18550 6c 6f 63 20 3d 20 28 75 31 36 29 6e 47 6f 74 3b  loc = (u16)nGot;
18560 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  .  }..  /* Move 
18570 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74  existing slots t
18580 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74  hat come after t
18590 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65  he newly inserte
185a0 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74  d slots.  ** out
185b0 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20   of the way */. 
185c0 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
185d0 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20  c-1; i>=iStart; 
185e0 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i--){.    pSrc->
185f0 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53  a[i+nExtra] = pS
18600 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  rc->a[i];.  }.  
18610 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 28 69  pSrc->nSrc += (i
18620 31 36 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a  16)nExtra;..  /*
18630 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20   Zero the newly 
18640 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20  allocated slots 
18650 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72  */.  memset(&pSr
18660 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  c->a[iStart], 0,
18670 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b   sizeof(pSrc->a[
18680 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66  0])*nExtra);.  f
18690 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69  or(i=iStart; i<i
186a0 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b  Start+nExtra; i+
186b0 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  +){.    pSrc->a[
186c0 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  i].iCursor = -1;
186d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72  .  }..  /* Retur
186e0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
186f0 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c  he enlarged SrcL
18700 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ist */.  return 
18710 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pSrc;.}.../*.** 
18720 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62  Append a new tab
18730 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67  le name to the g
18740 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43  iven SrcList.  C
18750 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c  reate a new SrcL
18760 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
18770 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  e.  A new entry 
18780 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  is created in th
18790 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69  e SrcList even i
187a0 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
187b0 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73  ..**.** A SrcLis
187c0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
187d0 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  r NULL if there 
187e0 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  is an OOM error.
187f0 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a    The returned.*
18800 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  * SrcList might 
18810 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
18820 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
18830 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20  was input or it 
18840 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65  might be.** a ne
18850 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f  w one.  If an OO
18860 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  M error does occ
18870 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72  urs, then the pr
18880 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69  ior value of pLi
18890 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e  st.** that is in
188a0 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
188b0 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63  ine is automatic
188c0 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  ally freed..**.*
188d0 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
188e0 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
188f0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
18900 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
18910 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
18920 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
18930 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
18940 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
18950 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
18960 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
18970 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
18980 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
18990 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
189a0 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
189b0 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
189c0 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
189d0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
189e0 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
189f0 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
18a00 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
18a10 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
18a20 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
18a30 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
18a40 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
18a50 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
18a60 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
18a70 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
18a80 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
18a90 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
18aa0 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
18ab0 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
18ac0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
18ad0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
18ae0 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
18af0 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,0);.**.** Then
18b00 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61   B is a table na
18b10 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  me and the datab
18b20 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70  ase name is unsp
18b30 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c  ecified.  If cal
18b40 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73  led.** like this
18b50 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
18b60 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
18b70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a  pend(D,A,B,C);.*
18b80 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74  *.** Then C is t
18b90 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
18ba0 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62  d B is the datab
18bb0 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63  ase name..*/.Src
18bc0 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
18bd0 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71  ListAppend(.  sq
18be0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
18bf0 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
18c00 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c  to notify of mal
18c10 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  loc failures */.
18c20 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74    SrcList *pList
18c30 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ,     /* Append 
18c40 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e  to this SrcList.
18c50 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20   NULL creates a 
18c60 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20  new SrcList */. 
18c70 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
18c80 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
18c90 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b   append */.  Tok
18ca0 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20  en *pDatabase   
18cb0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20   /* Database of 
18cc0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  the table */.){.
18cd0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
18ce0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
18cf0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
18d00 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
18d10 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
18d20 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69  db, sizeof(SrcLi
18d30 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
18d40 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
18d50 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
18d60 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20  Alloc = 1;.  }. 
18d70 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
18d80 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
18d90 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69  b, pList, 1, pLi
18da0 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 69 66 28  st->nSrc);.  if(
18db0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
18dc0 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
18dd0 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
18de0 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65  , pList);.    re
18df0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 49  turn 0;.  }.  pI
18e00 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
18e10 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  pList->nSrc-1];.
18e20 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
18e30 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d  && pDatabase->z=
18e40 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62  =0 ){.    pDatab
18e50 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ase = 0;.  }.  i
18e60 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
18e70 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f  pTable ){.    To
18e80 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61  ken *pTemp = pDa
18e90 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74  tabase;.    pDat
18ea0 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a  abase = pTable;.
18eb0 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65      pTable = pTe
18ec0 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  mp;.  }.  pItem-
18ed0 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
18ee0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
18ef0 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74  , pTable);.  pIt
18f00 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
18f10 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
18f20 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61  oken(db, pDataba
18f30 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  se);.  return pL
18f40 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  ist;.}../*.** As
18f50 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20  sign VdbeCursor 
18f60 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f  index numbers to
18f70 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
18f80 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64   SrcList.*/.void
18f90 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
18fa0 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72  ssignCursors(Par
18fb0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
18fc0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
18fd0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
18fe0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
18ff0 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69  em;.  assert(pLi
19000 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  st || pParse->db
19010 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
19020 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
19030 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
19040 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
19050 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
19060 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
19070 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75    if( pItem->iCu
19080 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b  rsor>=0 ) break;
19090 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43  .      pItem->iC
190a0 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
190b0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
190c0 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
190d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
190e0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
190f0 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
19100 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pItem->pSelect->
19110 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSrc);.      }. 
19120 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
19130 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
19140 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75  re SrcList inclu
19150 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62  ding all its sub
19160 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  structure..*/.vo
19170 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
19180 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
19190 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  *db, SrcList *pL
191a0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
191b0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
191c0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
191d0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
191e0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65  turn;.  for(pIte
191f0 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
19200 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
19210 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
19220 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
19230 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74  (db, pItem->zDat
19240 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  abase);.    sqli
19250 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
19260 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
19270 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19280 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  b, pItem->zAlias
19290 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
192a0 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
192b0 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c  zIndex);.    sql
192c0 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
192d0 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
192e0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
192f0 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
19300 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
19310 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
19320 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29  (db, pItem->pOn)
19330 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
19340 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
19350 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
19360 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
19370 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
19380 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
19390 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
193a0 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61   the parser to a
193b0 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  dd a new term to
193c0 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61   the.** end of a
193d0 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c   growing FROM cl
193e0 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70  ause.  The "p" p
193f0 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
19400 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46  part of.** the F
19410 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20  ROM clause that 
19420 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
19430 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22   constructed.  "
19440 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66  p" is NULL.** if
19450 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
19460 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  st term of the F
19470 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61  ROM clause.  pTa
19480 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
19490 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d  e.** are the nam
194a0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  e of the table a
194b0 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  nd database name
194c0 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
194d0 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44  ause term..** pD
194e0 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20  atabase is NULL 
194f0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
19500 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69  name qualifier i
19510 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a  s missing - the.
19520 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20  ** usual case.  
19530 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20  If the term has 
19540 61 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41  a alias, then pA
19550 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74  lias points to t
19560 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65  he.** alias toke
19570 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  n.  If the term 
19580 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74  is a subquery, t
19590 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73  hen pSubquery is
195a0 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73   the.** SELECT s
195b0 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68  tatement that th
195c0 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64  e subquery encod
195d0 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20  es.  The pTable 
195e0 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  and.** pDatabase
195f0 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
19600 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72  NULL for subquer
19610 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e  ies.  The pOn an
19620 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61  d pUsing.** para
19630 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63  meters are the c
19640 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e  ontent of the ON
19650 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
19660 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
19670 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77   a new SrcList w
19680 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20  hich encodes is 
19690 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68  the FROM with th
196a0 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64  e new.** term ad
196b0 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ded..*/.SrcList 
196c0 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
196d0 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20  ppendFromTerm(. 
196e0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
196f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
19700 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
19710 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20   SrcList *p,    
19720 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19730 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65  left part of the
19740 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72   FROM clause alr
19750 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54  eady seen */.  T
19760 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
19770 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
19780 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61  f the table to a
19790 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63  dd to the FROM c
197a0 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  lause */.  Token
197b0 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20   *pDatabase,    
197c0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
197d0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
197e0 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a  ining pTable */.
197f0 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c    Token *pAlias,
19800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19810 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
19820 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78   of the AS subex
19830 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65  pression */.  Se
19840 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c  lect *pSubquery,
19850 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75        /* A subqu
19860 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63  ery used in plac
19870 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d  e of a table nam
19880 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e  e */.  Expr *pOn
19890 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
198a0 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  * The ON clause 
198b0 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49  of a join */.  I
198c0 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20  dList *pUsing   
198d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53         /* The US
198e0 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
198f0 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  join */.){.  str
19900 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
19910 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
19920 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
19930 3e 64 62 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  >db;.  p = sqlit
19940 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
19950 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70  db, p, pTable, p
19960 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
19970 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 53 72 63   p==0 || p->nSrc
19980 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
19990 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
199a0 20 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74   pOn);.    sqlit
199b0 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
199c0 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  b, pUsing);.    
199d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
199e0 65 74 65 28 64 62 2c 20 70 53 75 62 71 75 65 72  ete(db, pSubquer
199f0 79 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  y);.    return p
19a00 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
19a10 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d  &p->a[p->nSrc-1]
19a20 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73 20 26  ;.  if( pAlias &
19a30 26 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20  & pAlias->n ){. 
19a40 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
19a50 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
19a60 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69  omToken(db, pAli
19a70 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  as);.  }.  pItem
19a80 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62  ->pSelect = pSub
19a90 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e  query;.  pItem->
19aa0 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74  pOn = pOn;.  pIt
19ab0 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73  em->pUsing = pUs
19ac0 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ing;.  return p;
19ad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
19ae0 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e   INDEXED BY or N
19af0 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
19b00 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65  e to the most re
19b10 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a  cently added .**
19b20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
19b30 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73 73  source-list pass
19b40 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
19b50 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
19b60 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
19b70 74 49 6e 64 65 78 65 64 42 79 28 50 61 72 73 65  tIndexedBy(Parse
19b80 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
19b90 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e  t *p, Token *pIn
19ba0 64 65 78 65 64 42 79 29 7b 0a 20 20 69 66 28 20  dexedBy){.  if( 
19bb0 70 49 6e 64 65 78 65 64 42 79 20 26 26 20 70 20  pIndexedBy && p 
19bc0 26 26 20 70 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a  && p->nSrc>0 ){.
19bd0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
19be0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
19bf0 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
19c00 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
19c10 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  Item->notIndexed
19c20 3d 3d 30 20 26 26 20 70 49 74 65 6d 2d 3e 7a 49  ==0 && pItem->zI
19c30 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ndex==0 );.    i
19c40 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e  f( pIndexedBy->n
19c50 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65 64  ==1 && !pIndexed
19c60 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f  By->z ){.      /
19c70 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44  * A "NOT INDEXED
19c80 22 20 63 6c 61 75 73 65 20 77 61 73 20 73 75 70  " clause was sup
19c90 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73 65  plied. See parse
19ca0 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  .y .      ** con
19cb0 73 74 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f  struct "indexed_
19cc0 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73  opt" for details
19cd0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d  . */.      pItem
19ce0 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31  ->notIndexed = 1
19cf0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19d00 20 20 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78     pItem->zIndex
19d10 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
19d20 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
19d30 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b  db, pIndexedBy);
19d40 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
19d50 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e  .** When buildin
19d60 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75  g up a FROM clau
19d70 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  se in the parser
19d80 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  , the join opera
19d90 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61  tor.** is initia
19da0 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20  lly attached to 
19db0 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
19dc0 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20  .  But the code 
19dd0 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70  generator.** exp
19de0 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ects the join op
19df0 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20  erator to be on 
19e00 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
19e10 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
19e20 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a  .** Shifts all j
19e30 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72  oin operators fr
19e40 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
19e50 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46   for an entire F
19e60 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a  ROM.** clause..*
19e70 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75  *.** Example: Su
19e80 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69  ppose the join i
19e90 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
19ea0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e  **           A n
19eb0 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
19ec0 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  n B.**.** The op
19ed0 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72  erator is "natur
19ee0 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20  al cross join". 
19ef0 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65   The A and B ope
19f00 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64  rands are stored
19f10 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61  .** in p->a[0] a
19f20 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70  nd p->a[1], resp
19f30 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70  ectively.  The p
19f40 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20  arser initially 
19f50 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70  stores the.** op
19f60 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20  erator with A.  
19f70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69  This routine shi
19f80 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f  fts that operato
19f90 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a  r over to B..*/.
19fa0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
19fb0 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65  istShiftJoinType
19fc0 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
19fd0 69 66 28 20 70 20 26 26 20 70 2d 3e 61 20 29 7b  if( p && p->a ){
19fe0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
19ff0 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b  for(i=p->nSrc-1;
1a000 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
1a010 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79    p->a[i].jointy
1a020 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a  pe = p->a[i-1].j
1a030 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20  ointype;.    }. 
1a040 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74     p->a[0].joint
1a050 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ype = 0;.  }.}..
1a060 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72  /*.** Begin a tr
1a070 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
1a080 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72  d sqlite3BeginTr
1a090 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
1a0a0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70  *pParse, int typ
1a0b0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
1a0c0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
1a0d0 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 50  int i;..  if( pP
1a0e0 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
1a0f0 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
1a100 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
1a110 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
1a120 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1a130 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1a140 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
1a150 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1a160 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1a170 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
1a180 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
1a190 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
1a1a0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1a1b0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21  pParse);.  if( !
1a1c0 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  v ) return;.  if
1a1d0 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52  ( type!=TK_DEFER
1a1e0 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  RED ){.    for(i
1a1f0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
1a200 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1a210 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a220 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
1a230 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43  i, (type==TK_EXC
1a240 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20  LUSIVE)+1);.    
1a250 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
1a260 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20  sBtree(v, i);.  
1a270 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1a280 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a290 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c  P_AutoCommit, 0,
1a2a0 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0);.}../*.** Co
1a2b0 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
1a2c0 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
1a2d0 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  e3CommitTransact
1a2e0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
1a2f0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
1a300 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
1a310 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
1a320 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
1a330 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  )==0 || db->aDb[
1a340 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
1a350 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
1a360 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
1a370 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1a380 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
1a390 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1a3a0 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
1a3b0 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22  ACTION, "COMMIT"
1a3c0 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
1a3d0 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
1a3e0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1a3f0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1a400 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a410 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1a420 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d  it, 1, 0);.  }.}
1a430 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
1a440 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1a450 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
1a460 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f  llbackTransactio
1a470 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
1a480 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1a490 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
1a4a0 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
1a4b0 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
1a4c0 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
1a4d0 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
1a4e0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1a4f0 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
1a500 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1a510 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
1a520 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1a530 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
1a540 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  TION, "ROLLBACK"
1a550 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
1a560 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
1a570 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1a580 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1a590 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a5a0 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1a5b0 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d  it, 1, 1);.  }.}
1a5c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1a5d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1a5e0 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
1a5f0 65 6e 20 69 74 20 70 61 72 73 65 73 20 61 20 63  en it parses a c
1a600 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74 65  ommand to create
1a610 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72 20  ,.** release or 
1a620 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20  rollback an SQL 
1a630 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76  savepoint. .*/.v
1a640 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76 65 70  oid sqlite3Savep
1a650 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72  oint(Parse *pPar
1a660 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65  se, int op, Toke
1a670 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
1a680 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
1a690 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1a6a0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
1a6b0 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
1a6c0 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
1a6d0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1a6e0 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66  pParse);.#ifndef
1a6f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1a700 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73  HORIZATION.    s
1a710 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1a720 20 2a 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49   *az[] = { "BEGI
1a730 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22  N", "RELEASE", "
1a740 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20  ROLLBACK" };.   
1a750 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f   assert( !SAVEPO
1a760 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56  INT_BEGIN && SAV
1a770 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d  EPOINT_RELEASE==
1a780 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  1 && SAVEPOINT_R
1a790 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65  OLLBACK==2 );.#e
1a7a0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20  ndif.    if( !v 
1a7b0 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  || sqlite3AuthCh
1a7c0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1a7d0 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a  TE_SAVEPOINT, az
1a7e0 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20  [op], zName, 0) 
1a7f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a800 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1a810 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
1a820 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
1a830 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a840 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70  dOp4(v, OP_Savep
1a850 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  oint, op, 0, 0, 
1a860 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49  zName, P4_DYNAMI
1a870 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
1a880 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54   Make sure the T
1a890 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20  EMP database is 
1a8a0 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62  open and availab
1a8b0 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74  le for use.  Ret
1a8c0 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
1a8d0 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65  r of errors.  Le
1a8e0 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ave any error me
1a8f0 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50  ssages in the pP
1a900 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
1a910 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  */.int sqlite3Op
1a920 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
1a930 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1a940 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1a950 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
1a960 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
1a970 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
1a980 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
1a990 74 20 72 63 3b 0a 20 20 20 20 73 74 61 74 69 63  t rc;.    static
1a9a0 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
1a9b0 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51   = .          SQ
1a9c0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1a9d0 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ITE |.          
1a9e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1a9f0 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
1aa00 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1aa10 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20  SIVE |.         
1aa20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
1aa30 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20  ETEONCLOSE |.   
1aa40 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1aa50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20  EN_TEMP_DB;..   
1aa60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1aa70 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c  eeFactory(db, 0,
1aa80 20 30 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55   0, SQLITE_DEFAU
1aa90 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20 66  LT_CACHE_SIZE, f
1aaa0 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
1aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aac0 20 20 20 20 20 20 20 26 64 62 2d 3e 61 44 62 5b         &db->aDb[
1aad0 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28  1].pBt);.    if(
1aae0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1aaf0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1ab00 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1ab10 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
1ab20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
1ab30 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
1ab40 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
1ab50 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1ab60 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  s");.      pPars
1ab70 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
1ab80 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1ab90 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 64  }.    assert( (d
1aba0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1abb0 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 7c 7c  E_InTrans)==0 ||
1abc0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
1abd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
1abe0 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
1abf0 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
1ac00 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65  PagerJournalMode
1ac10 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
1ac20 65 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  er(db->aDb[1].pB
1ac30 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac50 64 62 2d 3e 64 66 6c 74 4a 6f 75 72 6e 61 6c 4d  db->dfltJournalM
1ac60 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ode);.  }.  retu
1ac70 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
1ac80 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
1ac90 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69  e that will veri
1aca0 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
1acb0 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a  okie and start.*
1acc0 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  * a read-transac
1acd0 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d  tion for all nam
1ace0 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
1acf0 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  s..**.** It is i
1ad00 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c  mportant that al
1ad10 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73  l schema cookies
1ad20 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64   be verified and
1ad30 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61   all.** read tra
1ad40 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61  nsactions be sta
1ad50 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74  rted before anyt
1ad60 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e  hing else happen
1ad70 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45  s in.** the VDBE
1ad80 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74   program.  But t
1ad90 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
1ada0 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
1adb0 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f  much other.** co
1adc0 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65  de has been gene
1add0 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20  rated.  So here 
1ade0 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a  is what we do:.*
1adf0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
1ae00 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
1ae10 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63   is called, we c
1ae20 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74  ode an OP_Goto t
1ae30 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70  hat.** will jump
1ae40 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
1ae50 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1ae60 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65  he program.  The
1ae70 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65  n we.** record e
1ae80 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68  very database th
1ae90 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68  at needs its sch
1aea0 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20  ema verified in 
1aeb0 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63  the.** pParse->c
1aec0 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e  ookieMask field.
1aed0 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61    Later, after a
1aee0 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61  ll other code ha
1aef0 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61  s been.** genera
1af00 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ted, the subrout
1af10 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68  ine that does th
1af20 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  e cookie verific
1af30 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74  ations and.** st
1af40 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  arts the transac
1af50 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f  tions will be co
1af60 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47  ded and the OP_G
1af70 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20  oto P2 value.** 
1af80 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
1af90 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75  point to that su
1afa0 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67  broutine.  The g
1afb0 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  eneration of the
1afc0 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  .** cookie verif
1afd0 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69  ication subrouti
1afe0 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20  ne code happens 
1aff0 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  in sqlite3Finish
1b000 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20  Coding()..**.** 
1b010 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f  If iDb<0 then co
1b020 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f  de the OP_Goto o
1b030 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20  nly - don't set 
1b040 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74  flag to verify t
1b050 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20  he.** schema on 
1b060 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20  any databases.  
1b070 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
1b080 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65   to position the
1b090 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c   OP_Goto.** earl
1b0a0 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62  y in the code, b
1b0b0 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66  efore we know if
1b0c0 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61   any database ta
1b0d0 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65  bles will be use
1b0e0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1b0f0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
1b100 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
1b110 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
1b120 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
1b130 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73 6b  e *v;.  int mask
1b140 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
1b150 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1b160 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
1b170 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f  turn;  /* This o
1b180 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
1b190 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f 72  here was a prior
1b1a0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20 3d   error */.  db =
1b1b0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1b1c0 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  f( pParse->cooki
1b1d0 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  eGoto==0 ){.    
1b1e0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
1b1f0 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  to = sqlite3Vdbe
1b200 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1b210 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a  o, 0, 0)+1;.  }.
1b220 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a    if( iDb>=0 ){.
1b230 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
1b240 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61  db->nDb );.    a
1b250 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
1b260 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44  Db].pBt!=0 || iD
1b270 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  b==1 );.    asse
1b280 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d  rt( iDb<SQLITE_M
1b290 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b  AX_ATTACHED+2 );
1b2a0 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69  .    mask = 1<<i
1b2b0 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61  Db;.    if( (pPa
1b2c0 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
1b2d0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
1b2e0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
1b2f0 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  ieMask |= mask;.
1b300 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f        pParse->co
1b310 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d  okieValue[iDb] =
1b320 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
1b330 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f  chema->schema_co
1b340 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20  okie;.      if( 
1b350 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
1b360 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
1b370 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d    sqlite3OpenTem
1b380 70 44 61 74 61 62 61 73 65 28 70 50 61 72 73 65  pDatabase(pParse
1b390 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1b3a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1b3b0 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
1b3c0 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66   that prepares f
1b3d0 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72  or doing an oper
1b3e0 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69  ation that.** mi
1b3f0 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
1b400 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
1b410 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
1b420 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  ts a new transac
1b430 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e  tion if we are n
1b440 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  ot already withi
1b450 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  n.** a transacti
1b460 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  on.  If we are a
1b470 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20  lready within a 
1b480 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
1b490 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  n a checkpoint.*
1b4a0 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  * is set if the 
1b4b0 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72  setStatement par
1b4c0 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20  ameter is true. 
1b4d0 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68   A checkpoint sh
1b4e0 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66  ould.** be set f
1b4f0 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68  or operations th
1b500 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64  at might fail (d
1b510 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69  ue to a constrai
1b520 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  nt) part of.** t
1b530 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61  he way through a
1b540 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65  nd which will ne
1b550 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20  ed to undo some 
1b560 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68  writes without h
1b570 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  aving to.** roll
1b580 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74  back the whole t
1b590 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72  ransaction.  For
1b5a0 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72   operations wher
1b5b0 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
1b5c0 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63  s.** can be chec
1b5d0 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63  ked before any c
1b5e0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
1b5f0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
1b600 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20   it is never.** 
1b610 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
1b620 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68  o a write and th
1b630 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  e checkpoint sho
1b640 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a  uld not be set..
1b650 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1b660 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1b670 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1b680 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65  , int setStateme
1b690 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  nt, int iDb){.  
1b6a0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
1b6b0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1b6c0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
1b6d0 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
1b6e0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
1b6f0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
1b700 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61   pParse->writeMa
1b710 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20  sk |= 1<<iDb;.  
1b720 69 66 28 20 73 65 74 53 74 61 74 65 6d 65 6e 74  if( setStatement
1b730 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74   && pParse->nest
1b740 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ed==0 ){.    sql
1b750 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1b760 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20  , OP_Statement, 
1b770 69 44 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iDb);.  }.}../*.
1b780 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
1b790 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74  if pIndex uses t
1b7a0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
1b7b0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65  uence pColl.  Re
1b7c0 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
1b7d0 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73  it does and fals
1b7e0 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
1b7f0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
1b800 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
1b810 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c  .static int coll
1b820 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74  ationMatch(const
1b830 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e   char *zColl, In
1b840 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
1b850 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1b860 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ; i<pIndex->nCol
1b870 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  umn; i++){.    c
1b880 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
1b890 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
1b8a0 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 7a 43 6f  ;.    if( z==zCo
1b8b0 6c 6c 20 7c 7c 20 28 7a 20 26 26 20 7a 43 6f 6c  ll || (z && zCol
1b8c0 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53  l && 0==sqlite3S
1b8d0 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29  trICmp(z, zColl)
1b8e0 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1b8f0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1b900 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1b910 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
1b920 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
1b930 20 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73   of pTab that us
1b940 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  e the collating 
1b950 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a  sequence pColl..
1b960 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  ** If pColl==0 t
1b970 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c  hen recompute al
1b980 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
1b990 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  b..*/.#ifndef SQ
1b9a0 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
1b9b0 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
1b9c0 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65  indexTable(Parse
1b9d0 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
1b9e0 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73  *pTab, char cons
1b9f0 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64  t *zColl){.  Ind
1ba00 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
1ba10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
1ba20 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1ba30 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20  with pTab */..  
1ba40 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d  for(pIndex=pTab-
1ba50 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
1ba60 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e   pIndex=pIndex->
1ba70 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1ba80 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c  zColl==0 || coll
1ba90 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c  ationMatch(zColl
1baa0 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  , pIndex) ){.   
1bab0 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
1bac0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
1bad0 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
1bae0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
1baf0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1bb00 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1bb10 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
1bb20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
1bb30 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1bb40 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
1bb50 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
1bb60 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
1bb70 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
1bb80 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
1bb90 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65  ll databases whe
1bba0 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65  re the.** indice
1bbb0 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  s use the collat
1bbc0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
1bbd0 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ll.  If pColl==0
1bbe0 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a   then recompute.
1bbf0 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65  ** all indices e
1bc00 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69  verywhere..*/.#i
1bc10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bc20 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
1bc30 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74   void reindexDat
1bc40 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50  abases(Parse *pP
1bc50 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74  arse, char const
1bc60 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a   *zColl){.  Db *
1bc70 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
1bc80 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
1bc90 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  gle database */.
1bca0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
1bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bcc0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
1bcd0 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
1bce0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1bcf0 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
1bd00 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1bd10 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68  ection */.  Hash
1bd20 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
1bd30 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1bd40 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
1bd50 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54  es in pDb */.  T
1bd60 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
1bd70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1bd80 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
1bd90 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28  abase */..  for(
1bda0 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61  iDb=0, pDb=db->a
1bdb0 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  Db; iDb<db->nDb;
1bdc0 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a   iDb++, pDb++){.
1bdd0 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21      assert( pDb!
1bde0 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  =0 );.    for(k=
1bdf0 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
1be00 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
1be10 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73  blHash);  k; k=s
1be20 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29  qliteHashNext(k)
1be30 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
1be40 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
1be50 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20  shData(k);.     
1be60 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
1be70 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c  arse, pTab, zCol
1be80 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
1be90 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
1bea0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1beb0 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  the REINDEX comm
1bec0 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  and..**.**      
1bed0 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20    REINDEX       
1bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bef0 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20       -- 1.**    
1bf00 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f      REINDEX  <co
1bf10 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20  llation>        
1bf20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20         -- 2.**  
1bf30 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
1bf40 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62  <database>.?<tab
1bf50 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a  lename>  -- 3.**
1bf60 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1bf70 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69   ?<database>.?<i
1bf80 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a  ndexname>  -- 4.
1bf90 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75  **.** Form 1 cau
1bfa0 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ses all indices 
1bfb0 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  in all attached 
1bfc0 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20  databases to be 
1bfd0 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d  rebuilt..** Form
1bfe0 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20   2 rebuilds all 
1bff0 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64  indices in all d
1c000 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73  atabases that us
1c010 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63  e the named.** c
1c020 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
1c030 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20  n.  Forms 3 and 
1c040 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61  4 rebuild the na
1c050 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c  med index or all
1c060 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f  .** indices asso
1c070 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1c080 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a  named table..*/.
1c090 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c0a0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64  MIT_REINDEX.void
1c0b0 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28   sqlite3Reindex(
1c0c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
1c0d0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f  oken *pName1, To
1c0e0 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20  ken *pName2){.  
1c0f0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
1c100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1c110 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1c120 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  e to be reindexe
1c130 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  d, or NULL */.  
1c140 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
1c150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c160 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ame of a table o
1c170 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e  r index */.  con
1c180 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  st char *zDb;   
1c190 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1c1a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1c1b0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1c1c0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1c1d0 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
1c1e0 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
1c1f0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c210 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
1c220 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
1c230 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
1c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c250 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1c260 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
1c270 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1c280 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
1c290 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1c2a0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  nnection */.  To
1c2b0 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20  ken *pObjName;  
1c2c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1c2d0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
1c2e0 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65  r index to be re
1c2f0 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a  indexed */..  /*
1c300 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
1c310 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
1c320 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
1c330 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
1c340 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
1c350 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
1c360 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
1c370 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
1c380 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
1c390 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
1c3a0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1c3b0 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30  .  if( pName1==0
1c3c0 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30   || pName1->z==0
1c3d0 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44   ){.    reindexD
1c3e0 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
1c3f0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
1c400 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61  .  }else if( pNa
1c410 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32  me2==0 || pName2
1c420 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  ->z==0 ){.    ch
1c430 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61  ar *zColl;.    a
1c440 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a  ssert( pName1->z
1c450 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20   );.    zColl = 
1c460 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1c470 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
1c480 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
1c490 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72  ( !zColl ) retur
1c4a0 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  n;.    pColl = s
1c4b0 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
1c4c0 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a  q(db, ENC(db), z
1c4d0 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66  Coll, 0);.    if
1c4e0 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
1c4f0 20 69 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20   if( zColl ){.  
1c500 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74        reindexDat
1c510 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a  abases(pParse, z
1c520 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Coll);.        s
1c530 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1c540 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d   zColl);.      }
1c550 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
1c560 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1c570 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
1c580 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  );.  }.  iDb = s
1c590 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
1c5a0 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
1c5b0 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e  , pName2, &pObjN
1c5c0 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
1c5d0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20  0 ) return;.  z 
1c5e0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1c5f0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e  mToken(db, pObjN
1c600 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
1c610 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62   ) return;.  zDb
1c620 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1c630 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20  zName;.  pTab = 
1c640 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1c650 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
1c660 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
1c670 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61  reindexTable(pPa
1c680 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20  rse, pTab, 0);. 
1c690 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1c6a0 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74  (db, z);.    ret
1c6b0 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  urn;.  }.  pInde
1c6c0 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
1c6d0 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29  ndex(db, z, zDb)
1c6e0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1c6f0 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20  e(db, z);.  if( 
1c700 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  pIndex ){.    sq
1c710 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1c720 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
1c730 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   0, iDb);.    sq
1c740 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
1c750 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
1c760 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
1c770 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
1c780 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1c790 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74  "unable to ident
1c7a0 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74  ify the object t
1c7b0 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29  o be reindexed")
1c7c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1c7d0 2a 20 52 65 74 75 72 6e 20 61 20 64 79 6e 61 6d  * Return a dynam
1c7e0 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b  icly allocated K
1c7f0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1c800 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
1c810 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65  d.** with OP_Ope
1c820 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e  nRead or OP_Open
1c830 57 72 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  Write to access 
1c840 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 70  database index p
1c850 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  Idx..**.** If su
1c860 63 63 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e  ccessful, a poin
1c870 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73  ter to the new s
1c880 74 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75  tructure is retu
1c890 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
1c8a0 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  se.** the caller
1c8b0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1c8c0 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  for calling sqli
1c8d0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 29 20  te3DbFree(db, ) 
1c8e0 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  on the returned 
1c8f0 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20 49 66 20  .** pointer. If 
1c900 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1c910 28 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f  (out of memory o
1c920 72 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74  r missing collat
1c930 69 6f 6e 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ion .** sequence
1c940 29 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ), NULL is retur
1c950 6e 65 64 20 61 6e 64 20 74 68 65 20 73 74 61 74  ned and the stat
1c960 65 20 6f 66 20 70 50 61 72 73 65 20 75 70 64 61  e of pParse upda
1c970 74 65 64 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a  ted to reflect.*
1c980 2a 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a  * the error..*/.
1c990 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
1c9a0 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 50 61 72  IndexKeyinfo(Par
1c9b0 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
1c9c0 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20  x *pIdx){.  int 
1c9d0 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  i;.  int nCol = 
1c9e0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
1c9f0 20 69 6e 74 20 6e 42 79 74 65 73 20 3d 20 73 69   int nBytes = si
1ca00 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20  zeof(KeyInfo) + 
1ca10 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28  (nCol-1)*sizeof(
1ca20 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c  CollSeq*) + nCol
1ca30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1ca40 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1ca50 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20  KeyInfo *pKey = 
1ca60 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74  (KeyInfo *)sqlit
1ca70 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
1ca80 62 2c 20 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69  b, nBytes);..  i
1ca90 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 70  f( pKey ){.    p
1caa0 4b 65 79 2d 3e 64 62 20 3d 20 70 50 61 72 73 65  Key->db = pParse
1cab0 2d 3e 64 62 3b 0a 20 20 20 20 70 4b 65 79 2d 3e  ->db;.    pKey->
1cac0 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
1cad0 20 2a 29 26 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c   *)&(pKey->aColl
1cae0 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20 61 73 73  [nCol]);.    ass
1caf0 65 72 74 28 20 26 70 4b 65 79 2d 3e 61 53 6f 72  ert( &pKey->aSor
1cb00 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28  tOrder[nCol]==&(
1cb10 28 28 75 38 20 2a 29 70 4b 65 79 29 5b 6e 42 79  ((u8 *)pKey)[nBy
1cb20 74 65 73 5d 29 20 29 3b 0a 20 20 20 20 66 6f 72  tes]) );.    for
1cb30 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
1cb40 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
1cb50 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
1cb60 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 61  Coll[i];.      a
1cb70 73 73 65 72 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a  ssert( zColl );.
1cb80 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c        pKey->aCol
1cb90 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f  l[i] = sqlite3Lo
1cba0 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
1cbb0 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  se, zColl);.    
1cbc0 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
1cbd0 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53  er[i] = pIdx->aS
1cbe0 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20  ortOrder[i];.   
1cbf0 20 7d 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69   }.    pKey->nFi
1cc00 65 6c 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b  eld = (u16)nCol;
1cc10 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72  .  }..  if( pPar
1cc20 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
1cc30 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1cc40 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b 65  , pKey);.    pKe
1cc50 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  y = 0;.  }.  ret
1cc60 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a              urn pKey;.}.