/ Hex Artifact Content
Login

Artifact 6f3d5f74e262d561d77f0210c6063b7122f16c98:


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 31 36 20 32 30 30 39 2f 30 32 2f 30 33  1.516 2009/02/03
02f0: 20 32 32 3a 31 37 3a 34 32 20 64 72 68 20 45 78   22:17:42 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 73 71 6c 69 74 65  ;.        sqlite
12b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f 50  3VdbeAddOp2(v,OP
12c0: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69  _VerifyCookie, i
12d0: 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  Db, pParse->cook
12e0: 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20  ieValue[iDb]);. 
12f0: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
1300: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1310: 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 7b 0a  ALTABLE.      {.
1320: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
1330: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1340: 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c  i<pParse->nVtabL
1350: 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ock; i++){.     
1360: 20 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20       char *vtab 
1370: 3d 20 28 63 68 61 72 20 2a 29 70 50 61 72 73 65  = (char *)pParse
1380: 2d 3e 61 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 2d  ->apVtabLock[i]-
1390: 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 20 20  >pVtab;.        
13a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13b0: 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  Op4(v, OP_VBegin
13c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c  , 0, 0, 0, vtab,
13d0: 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 20   P4_VTAB);.     
13e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
13f0: 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20 3d  rse->nVtabLock =
1400: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   0;.      }.#end
1410: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
1420: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
1430: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
1440: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1450: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1460: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1470: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1480: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1490: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
14a0: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
14b0: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
14c0: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
14d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
14e0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
14f0: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1500: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1510: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61   OP_Goto, 0, pPa
1520: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29  rse->cookieGoto)
1530: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
1540: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
1550: 43 45 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  CE.    if( !db->
1560: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
1570: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
1580: 20 50 34 20 61 72 67 75 6d 65 6e 74 20 6f 66 20   P4 argument of 
1590: 74 68 65 20 66 69 72 73 74 20 6f 70 63 6f 64 65  the first opcode
15a0: 20 28 77 68 69 63 68 20 77 69 6c 6c 20 61 6c 77   (which will alw
15b0: 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ays be.      ** 
15c0: 61 6e 20 4f 50 5f 54 72 61 63 65 29 20 74 6f 20  an OP_Trace) to 
15d0: 62 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  be the complete 
15e0: 74 65 78 74 20 6f 66 20 74 68 65 20 63 75 72 72  text of the curr
15f0: 65 6e 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ent SQL statemen
1600: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
1610: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
1620: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
1630: 28 76 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  (v, 0);.      if
1640: 28 20 70 4f 70 20 26 26 20 70 4f 70 2d 3e 6f 70  ( pOp && pOp->op
1650: 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 29  code==OP_Trace )
1660: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1670: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
1680: 20 30 2c 20 70 50 61 72 73 65 2d 3e 7a 53 71 6c   0, pParse->zSql
1690: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
16b0: 6e 74 29 28 70 50 61 72 73 65 2d 3e 7a 54 61 69  nt)(pParse->zTai
16c0: 6c 20 2d 20 70 50 61 72 73 65 2d 3e 7a 53 71 6c  l - pParse->zSql
16d0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
16e0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
16f0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f  TE_OMIT_TRACE */
1700: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20  .  }...  /* Get 
1710: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
1720: 20 72 65 61 64 79 20 66 6f 72 20 65 78 65 63 75   ready for execu
1730: 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tion.  */.  if( 
1740: 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  v && pParse->nEr
1750: 72 3d 3d 30 20 26 26 20 21 64 62 2d 3e 6d 61 6c  r==0 && !db->mal
1760: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 23 69 66  locFailed ){.#if
1770: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1780: 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65  .    FILE *trace
1790: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
17a0: 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65  SQLITE_VdbeTrace
17b0: 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a 20  )!=0 ? stdout : 
17c0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  0;.    sqlite3Vd
17d0: 62 65 54 72 61 63 65 28 76 2c 20 74 72 61 63 65  beTrace(v, trace
17e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73  );.#endif.    as
17f0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69  sert( pParse->di
1800: 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30  sableColCache==0
1810: 20 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 73   );  /* Disables
1820: 20 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73 20   and re-enables 
1830: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 73 71 6c  match */.    sql
1840: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
1850: 79 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61  y(v, pParse->nVa
1860: 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b  r, pParse->nMem+
1870: 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
1880: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
1890: 73 65 2d 3e 6e 54 61 62 2b 33 2c 20 70 50 61 72  se->nTab+3, pPar
18a0: 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a 20 20  se->explain);.  
18b0: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
18c0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
18d0: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
18e0: 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Set = 0;.  }else
18f0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d   if( pParse->rc=
1900: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1910: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
1920: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
1930: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20  .  pParse->nTab 
1940: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
1950: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Mem = 0;.  pPars
1960: 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70  e->nSet = 0;.  p
1970: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b  Parse->nVar = 0;
1980: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  .  pParse->cooki
1990: 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61  eMask = 0;.  pPa
19a0: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20  rse->cookieGoto 
19b0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75  = 0;.}../*.** Ru
19c0: 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64  n the parser and
19d0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
19e0: 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f  recursively in o
19f0: 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65  rder to generate
1a00: 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65  .** code for the
1a10: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67   SQL statement g
1a20: 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e  iven onto the en
1a30: 64 20 6f 66 20 74 68 65 20 70 50 61 72 73 65 20  d of the pParse 
1a40: 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65  context.** curre
1a50: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
1a60: 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74  ruction.  When t
1a70: 68 65 20 70 61 72 73 65 72 20 69 73 20 72 75 6e  he parser is run
1a80: 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20   recursively.** 
1a90: 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 66 69  this way, the fi
1aa0: 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e  nal OP_Halt is n
1ab0: 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20  ot appended and 
1ac0: 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61  other initializa
1ad0: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61  tion.** and fina
1ae0: 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61  lization steps a
1af0: 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75  re omitted becau
1b00: 73 65 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e  se those are han
1b10: 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20  dling by the.** 
1b20: 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72  outermost parser
1b30: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72  ..**.** Not ever
1b40: 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62  ything is nestab
1b50: 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69  le.  This facili
1b60: 74 79 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  ty is designed t
1b70: 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45  o permit.** INSE
1b80: 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20  RT, UPDATE, and 
1b90: 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
1ba0: 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45  s against SQLITE
1bb0: 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a  _MASTER.  Use.**
1bc0: 20 63 61 72 65 20 69 66 20 79 6f 75 20 64 65 63   care if you dec
1bd0: 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73  ide to try to us
1be0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  e this routine f
1bf0: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
1c00: 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  rposes..*/.void 
1c10: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1c20: 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
1c30: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
1c40: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
1c50: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
1c60: 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20  r *zSql;.  char 
1c70: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
1c80: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1c90: 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65 66 69  arse->db;.# defi
1ca0: 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a  ne SAVE_SZ  (siz
1cb0: 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66  eof(Parse) - off
1cc0: 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72  setof(Parse,nVar
1cd0: 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  )).  char saveBu
1ce0: 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69  f[SAVE_SZ];..  i
1cf0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1d00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
1d10: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  rt( pParse->nest
1d20: 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73  ed<10 );  /* Nes
1d30: 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  ting should only
1d40: 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64   be of limited d
1d50: 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61  epth */.  va_sta
1d60: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
1d70: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
1d80: 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 46  3VMPrintf(db, zF
1d90: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
1da0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20  _end(ap);.  if( 
1db0: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  zSql==0 ){.    r
1dc0: 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61  eturn;   /* A ma
1dd0: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
1de0: 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70  ailed */.  }.  p
1df0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b  Parse->nested++;
1e00: 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75  .  memcpy(saveBu
1e10: 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72  f, &pParse->nVar
1e20: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65  , SAVE_SZ);.  me
1e30: 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56  mset(&pParse->nV
1e40: 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b  ar, 0, SAVE_SZ);
1e50: 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72  .  sqlite3RunPar
1e60: 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c  ser(pParse, zSql
1e70: 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  , &zErrMsg);.  s
1e80: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1e90: 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c   zErrMsg);.  sql
1ea0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1eb0: 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  Sql);.  memcpy(&
1ec0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61  pParse->nVar, sa
1ed0: 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b  veBuf, SAVE_SZ);
1ee0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  .  pParse->neste
1ef0: 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  d--;.}../*.** Lo
1f00: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
1f10: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
1f20: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
1f30: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
1f40: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
1f50: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
1f60: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
1f70: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
1f80: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
1f90: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
1fa0: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
1fb0: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
1fc0: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
1fd0: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
1fe0: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
1ff0: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
2000: 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a  e table and the.
2010: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  ** first matchin
2020: 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72  g table is retur
2030: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
2040: 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ng for duplicate
2050: 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
2060: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
2070: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54  earch order is T
2080: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
2090: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a  MAIN, then any.*
20a0: 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
20b0: 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e  bases added usin
20c0: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
20d0: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  mand..**.** See 
20e0: 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61  also sqlite3Loca
20f0: 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61  teTable()..*/.Ta
2100: 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  ble *sqlite3Find
2110: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
2120: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2130: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
2140: 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *zDatabase){.  
2150: 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20  Table *p = 0;.  
2160: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
2170: 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e  me;.  assert( zN
2180: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 6e 4e 61 6d  ame!=0 );.  nNam
2190: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
21a0: 6e 28 64 62 2c 20 7a 4e 61 6d 65 29 20 2b 20 31  n(db, zName) + 1
21b0: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
21c0: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
21d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
21e0: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
21f0: 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68  : i;   /* Search
2200: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
2210: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 61  N */.    if( zDa
2220: 74 61 62 61 73 65 21 3d 30 20 26 26 20 73 71 6c  tabase!=0 && sql
2230: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74  ite3StrICmp(zDat
2240: 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a  abase, db->aDb[j
2250: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2260: 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  nue;.    p = sql
2270: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
2280: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2290: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65  ->tblHash, zName
22a0: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , nName);.    if
22b0: 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ( p ) break;.  }
22c0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
22d0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
22e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
22f0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2300: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
2310: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
2320: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
2330: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
2340: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
2350: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
2360: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
2370: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
2380: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
2390: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41  if not found.  A
23a0: 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20  lso leave an.** 
23b0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
23c0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
23d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
23e0: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
23f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
2400: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2410: 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
2420: 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65  ** routine leave
2430: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
2440: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
2450: 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73  rrMsg where.** s
2460: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2470: 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54  ) does not..*/.T
2480: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63  able *sqlite3Loc
2490: 61 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73  ateTable(.  Pars
24a0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
24b0: 20 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e     /* context in
24c0: 20 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74   which to report
24d0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
24e0: 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 20 20   isView,        
24f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c      /* True if l
2500: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 56 49 45  ooking for a VIE
2510: 57 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  W rather than a 
2520: 54 41 42 4c 45 20 2a 2f 0a 20 20 63 6f 6e 73 74  TABLE */.  const
2530: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
2540: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2550: 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 6c 6f   table we are lo
2560: 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 63  oking for */.  c
2570: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73  onst char *zDbas
2580: 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  e     /* Name of
2590: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
25a0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
25b0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
25c0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64  .  /* Read the d
25d0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
25e0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
25f0: 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
2600: 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
2610: 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72  and code in pPar
2620: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  se and return NU
2630: 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  LL. */.  if( SQL
2640: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
2650: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
2660: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2670: 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71  0;.  }..  p = sq
2680: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70  lite3FindTable(p
2690: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
26a0: 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28  , zDbase);.  if(
26b0: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e   p==0 ){.    con
26c0: 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20  st char *zMsg = 
26d0: 69 73 56 69 65 77 20 3f 20 22 6e 6f 20 73 75 63  isView ? "no suc
26e0: 68 20 76 69 65 77 22 20 3a 20 22 6e 6f 20 73 75  h view" : "no su
26f0: 63 68 20 74 61 62 6c 65 22 3b 0a 20 20 20 20 69  ch table";.    i
2700: 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20 20 20  f( zDbase ){.   
2710: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2720: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20  sg(pParse, "%s: 
2730: 25 73 2e 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44  %s.%s", zMsg, zD
2740: 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  base, zName);.  
2750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2760: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2770: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c  Parse, "%s: %s",
2780: 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20   zMsg, zName);. 
2790: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
27a0: 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
27b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
27c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
27d0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
27e0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
27f0: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
2800: 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
2810: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
2820: 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20  f that index.** 
2830: 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  and the name of 
2840: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
2850: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  t contains the i
2860: 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  ndex..** Return 
2870: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
2880: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74  d..**.** If zDat
2890: 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20  abase is 0, all 
28a0: 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65  databases are se
28b0: 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a  arched for the.*
28c0: 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20  * table and the 
28d0: 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69  first matching i
28e0: 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65 64  ndex is returned
28f0: 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a  .  (No checking.
2900: 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ** for duplicate
2910: 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20   index names is 
2920: 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72  done.)  The sear
2930: 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54  ch order is.** T
2940: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
2950: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61  MAIN, then any a
2960: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
2970: 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e  es added.** usin
2980: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
2990: 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a  mand..*/.Index *
29a0: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
29b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
29c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
29d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
29e0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
29f0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
2a00: 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t nName = sqlite
2a10: 33 53 74 72 6c 65 6e 28 64 62 2c 20 7a 4e 61 6d  3Strlen(db, zNam
2a20: 65 29 2b 31 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d  e)+1;.  for(i=OM
2a30: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d  IT_TEMPDB; i<db-
2a40: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
2a50: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
2a60: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
2a70: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2a80: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65  MAIN */.    Sche
2a90: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62  ma *pSchema = db
2aa0: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2ab0: 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26  ;.    if( zDb &&
2ac0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2ad0: 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  zDb, db->aDb[j].
2ae0: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
2af0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
2b00: 53 63 68 65 6d 61 20 7c 7c 20 28 6a 3d 3d 31 20  Schema || (j==1 
2b10: 26 26 20 21 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  && !db->aDb[1].p
2b20: 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
2b30: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
2b40: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
2b50: 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  ind(&pSchema->id
2b60: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  xHash, zName, nN
2b70: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
2b80: 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20  if( p ) break;. 
2b90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
2ba0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20  ../*.** Reclaim 
2bb0: 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  the memory used 
2bc0: 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73  by an index.*/.s
2bd0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 49  tatic void freeI
2be0: 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a  ndex(Index *p){.
2bf0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2c00: 70 2d 3e 70 54 61 62 6c 65 2d 3e 64 62 3b 0a 20  p->pTable->db;. 
2c10: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2c20: 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  b, p->zColAff);.
2c30: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2c40: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
2c50: 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65   Remove the give
2c60: 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65  n index from the
2c70: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
2c80: 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69  e, and free.** i
2c90: 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ts memory struct
2ca0: 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ures..**.** The 
2cb0: 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64  index is removed
2cc0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2cd0: 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 62  se hash tables b
2ce0: 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  ut.** it is not 
2cf0: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
2d00: 65 20 54 61 62 6c 65 20 74 68 61 74 20 69 74 20  e Table that it 
2d10: 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69  indexes..** Unli
2d20: 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 54  nking from the T
2d30: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f 6e  able must be don
2d40: 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  e by the calling
2d50: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
2d60: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
2d70: 44 65 6c 65 74 65 49 6e 64 65 78 28 49 6e 64 65  DeleteIndex(Inde
2d80: 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a  x *p){.  Index *
2d90: 70 4f 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68  pOld;.  const ch
2da0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a  ar *zName = p->z
2db0: 4e 61 6d 65 3b 0a 0a 20 20 70 4f 6c 64 20 3d 20  Name;..  pOld = 
2dc0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
2dd0: 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  t(&p->pSchema->i
2de0: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 0a 20  dxHash, zName,. 
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e10: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
2e20: 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  +1, 0);.  assert
2e30: 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c  ( pOld==0 || pOl
2e40: 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65 65 49 6e  d==p );.  freeIn
2e50: 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dex(p);.}../*.**
2e60: 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63   For the index c
2e70: 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77  alled zIdxName w
2e80: 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e  hich is found in
2e90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44   the database iD
2ea0: 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61  b,.** unlike tha
2eb0: 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73  t index from its
2ec0: 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f   Table then remo
2ed0: 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f  ve the index fro
2ee0: 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68  m.** the index h
2ef0: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
2f00: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74  ee all memory st
2f10: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
2f20: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
2f30: 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73  index..*/.void s
2f40: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
2f50: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
2f60: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
2f70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
2f80: 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  xName){.  Index 
2f90: 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c  *pIndex;.  int l
2fa0: 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  en;.  Hash *pHas
2fb0: 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  h = &db->aDb[iDb
2fc0: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ].pSchema->idxHa
2fd0: 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c  sh;..  len = sql
2fe0: 69 74 65 33 53 74 72 6c 65 6e 28 64 62 2c 20 7a  ite3Strlen(db, z
2ff0: 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64  IdxName);.  pInd
3000: 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ex = sqlite3Hash
3010: 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49  Insert(pHash, zI
3020: 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c 20 30  dxName, len+1, 0
3030: 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  );.  if( pIndex 
3040: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  ){.    if( pInde
3050: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3060: 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  x==pIndex ){.   
3070: 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c     pIndex->pTabl
3080: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  e->pIndex = pInd
3090: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ex->pNext;.    }
30a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
30b0: 78 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  x *p;.      for(
30c0: 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  p=pIndex->pTable
30d0: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70  ->pIndex; p && p
30e0: 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b  ->pNext!=pIndex;
30f0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20   p=p->pNext){}. 
3100: 20 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d       if( p && p-
3110: 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29  >pNext==pIndex )
3120: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65  {.        p->pNe
3130: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
3140: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
3150: 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28  }.    freeIndex(
3160: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64  pIndex);.  }.  d
3170: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
3180: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
3190: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
31a0: 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f   all schema info
31b0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
31c0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
31d0: 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73  tables of.** a s
31e0: 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 2e 20  ingle database. 
31f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3200: 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61   called to recla
3210: 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66  im memory.** bef
3220: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
3230: 20 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20   closes.  It is 
3240: 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69  also called duri
3250: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  ng a rollback.**
3260: 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20 73   if there were s
3270: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75  chema changes du
3280: 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ring the transac
3290: 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20  tion or if a.** 
32a0: 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69  schema-cookie mi
32b0: 73 6d 61 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a  smatch occurs..*
32c0: 2a 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 20 74  *.** If iDb==0 t
32d0: 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e  hen reset the in
32e0: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61  ternal schema ta
32f0: 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74  bles for all dat
3300: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20  abase.** files. 
3310: 20 49 66 20 69 44 62 3e 3d 31 20 74 68 65 6e 20   If iDb>=1 then 
3320: 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e  reset the intern
3330: 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e  al schema for on
3340: 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65  ly the.** single
3350: 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e   file indicated.
3360: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3370: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
3380: 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ema(sqlite3 *db,
3390: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74   int iDb){.  int
33a0: 20 69 2c 20 6a 3b 0a 20 20 61 73 73 65 72 74 28   i, j;.  assert(
33b0: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
33c0: 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66 28  b->nDb );..  if(
33d0: 20 69 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73   iDb==0 ){.    s
33e0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
33f0: 41 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a 20 20 66  All(db);.  }.  f
3400: 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e  or(i=iDb; i<db->
3410: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  nDb; i++){.    D
3420: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
3430: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
3440: 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
3450: 20 20 20 20 61 73 73 65 72 74 28 69 3d 3d 31 20      assert(i==1 
3460: 7c 7c 20 28 70 44 62 2d 3e 70 42 74 20 26 26 20  || (pDb->pBt && 
3470: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
3480: 73 4d 75 74 65 78 28 70 44 62 2d 3e 70 42 74 29  sMutex(pDb->pBt)
3490: 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
34a0: 33 53 63 68 65 6d 61 46 72 65 65 28 70 44 62 2d  3SchemaFree(pDb-
34b0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
34c0: 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30 20 29  .    if( iDb>0 )
34d0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
34e0: 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b  ssert( iDb==0 );
34f0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
3500: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
3510: 61 6e 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33  anges;.  sqlite3
3520: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
3530: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  );..  /* If one 
3540: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61  or more of the a
3550: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
3560: 65 20 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e  e files has been
3570: 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68   closed,.  ** th
3580: 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66  en remove them f
3590: 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72  rom the auxiliar
35a0: 79 20 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e  y database list.
35b0: 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20    We take the.  
35c0: 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  ** opportunity t
35d0: 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65 20 73  o do this here s
35e0: 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a 75 73  ince we have jus
35f0: 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66  t deleted all of
3600: 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61   the.  ** schema
3610: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
3620: 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f   therefore do no
3630: 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61  t have to make a
3640: 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  ny changes.  ** 
3650: 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20  to any of those 
3660: 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
3670: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
3680: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  b; i++){.    str
3690: 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64  uct Db *pDb = &d
36a0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
36b0: 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29  f( pDb->pBt==0 )
36c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
36d0: 3e 70 41 75 78 20 26 26 20 70 44 62 2d 3e 78 46  >pAux && pDb->xF
36e0: 72 65 65 41 75 78 20 29 20 70 44 62 2d 3e 78 46  reeAux ) pDb->xF
36f0: 72 65 65 41 75 78 28 70 44 62 2d 3e 70 41 75 78  reeAux(pDb->pAux
3700: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 41  );.      pDb->pA
3710: 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ux = 0;.    }.  
3720: 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69  }.  for(i=j=2; i
3730: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
3740: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
3750: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
3760: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
3770: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Bt==0 ){.      s
3780: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3790: 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20   pDb->zName);.  
37a0: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d      pDb->zName =
37b0: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
37c0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
37d0: 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64  ( j<i ){.      d
37e0: 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e  b->aDb[j] = db->
37f0: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aDb[i];.    }.  
3800: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d    j++;.  }.  mem
3810: 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c  set(&db->aDb[j],
3820: 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a   0, (db->nDb-j)*
3830: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a  sizeof(db->aDb[j
3840: 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  ]));.  db->nDb =
3850: 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44   j;.  if( db->nD
3860: 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21  b<=2 && db->aDb!
3870: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
3880: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d  {.    memcpy(db-
3890: 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e  >aDbStatic, db->
38a0: 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62  aDb, 2*sizeof(db
38b0: 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20  ->aDb[0]));.    
38c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
38d0: 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20  , db->aDb);.    
38e0: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
38f0: 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a  bStatic;.  }.}..
3900: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3910: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
3920: 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72  n a commit occur
3930: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
3940: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
3950: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
3960: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67  *db){.  db->flag
3970: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
3980: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
3990: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
39a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
39b0: 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
39c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
39d0: 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75   sqliteResetColu
39e0: 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70  mnNames(Table *p
39f0: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
3a00: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
3a10: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
3a20: 20 70 54 61 62 6c 65 2d 3e 64 62 3b 0a 20 20 61   pTable->db;.  a
3a30: 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30  ssert( pTable!=0
3a40: 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20   );.  if( (pCol 
3a50: 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21  = pTable->aCol)!
3a60: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 ){.    for(i=
3a70: 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  0; i<pTable->nCo
3a80: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
3a90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
3aa0: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
3ab0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
3ac0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
3ad0: 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  b, pCol->pDflt);
3ae0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
3af0: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
3b00: 54 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Type);.      sql
3b10: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3b20: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Col->zColl);.   
3b30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
3b40: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
3b50: 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 70 54  >aCol);.  }.  pT
3b60: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  able->aCol = 0;.
3b70: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
3b80: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d   0;.}../*.** Rem
3b90: 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64  ove the memory d
3ba0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
3bb0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3bc0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c  he given.** Tabl
3bd0: 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  e.  No changes a
3be0: 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20  re made to disk 
3bf0: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
3c00: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3c10: 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73  ine just deletes
3c20: 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
3c30: 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ure.  It does no
3c40: 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20  t unlink.** the 
3c50: 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75 63  table data struc
3c60: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61  ture from the ha
3c70: 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64  sh table.  Nor d
3c80: 6f 65 73 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a  oes it remove.**
3c90: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 66 72   foreign keys fr
3ca0: 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 2e 61 46  om the sqlite.aF
3cb0: 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20  Key hash table. 
3cc0: 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73   But it does des
3cd0: 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73  troy.** memory s
3ce0: 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65  tructures of the
3cf0: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
3d00: 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69  eign keys associ
3d10: 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68  ated with .** th
3d20: 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  e table..*/.void
3d30: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
3d40: 62 6c 65 28 54 61 62 6c 65 20 2a 70 54 61 62 6c  ble(Table *pTabl
3d50: 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
3d60: 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46  dex, *pNext;.  F
3d70: 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65  Key *pFKey, *pNe
3d80: 78 74 46 4b 65 79 3b 0a 20 20 73 71 6c 69 74 65  xtFKey;.  sqlite
3d90: 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 54  3 *db;..  if( pT
3da0: 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  able==0 ) return
3db0: 3b 0a 20 20 64 62 20 3d 20 70 54 61 62 6c 65 2d  ;.  db = pTable-
3dc0: 3e 64 62 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  >db;..  /* Do no
3dd0: 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62  t delete the tab
3de0: 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66  le until the ref
3df0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61  erence count rea
3e00: 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20  ches zero. */.  
3e10: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  pTable->nRef--;.
3e20: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 52    if( pTable->nR
3e30: 65 66 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ef>0 ){.    retu
3e40: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
3e50: 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d 3d  ( pTable->nRef==
3e60: 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  0 );..  /* Delet
3e70: 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73  e all indices as
3e80: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
3e90: 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20  is table.  */.  
3ea0: 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61  for(pIndex = pTa
3eb0: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  ble->pIndex; pIn
3ec0: 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78  dex; pIndex=pNex
3ed0: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
3ee0: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
3ef0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
3f00: 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
3f10: 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  le->pSchema );. 
3f20: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49     sqliteDeleteI
3f30: 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
3f40: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
3f50: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
3f60: 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  EY.  /* Delete a
3f70: 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ll foreign keys 
3f80: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3f90: 74 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65  this table.  The
3fa0: 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c   keys.  ** shoul
3fb0: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
3fc0: 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  een unlinked fro
3fd0: 6d 20 74 68 65 20 70 53 63 68 65 6d 61 2d 3e 61  m the pSchema->a
3fe0: 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 20  FKey hash table 
3ff0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65  .  */.  for(pFKe
4000: 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b  y=pTable->pFKey;
4010: 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e   pFKey; pFKey=pN
4020: 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e  extFKey){.    pN
4030: 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d  extFKey = pFKey-
4040: 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20  >pNextFrom;.    
4050: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 48  assert( sqlite3H
4060: 61 73 68 46 69 6e 64 28 26 70 54 61 62 6c 65 2d  ashFind(&pTable-
4070: 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c  >pSchema->aFKey,
4080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4090: 20 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 65              pFKe
40a0: 79 2d 3e 7a 54 6f 2c 20 73 71 6c 69 74 65 33 53  y->zTo, sqlite3S
40b0: 74 72 6c 65 6e 33 30 28 70 46 4b 65 79 2d 3e 7a  trlen30(pFKey->z
40c0: 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b  To)+1)!=pFKey );
40d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
40e0: 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 20  ee(db, pFKey);. 
40f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
4100: 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65  Delete the Table
4110: 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c   structure itsel
4120: 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  f..  */.  sqlite
4130: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
4140: 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69  (pTable);.  sqli
4150: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
4160: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
4170: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4180: 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66  , pTable->zColAf
4190: 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  f);.  sqlite3Sel
41a0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  ectDelete(db, pT
41b0: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  able->pSelect);.
41c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
41d0: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69  MIT_CHECK.  sqli
41e0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
41f0: 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b  , pTable->pCheck
4200: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
4210: 74 65 33 56 74 61 62 43 6c 65 61 72 28 70 54 61  te3VtabClear(pTa
4220: 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ble);.  sqlite3D
4230: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
4240: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  );.}../*.** Unli
4250: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
4260: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
4270: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
4280: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
4290: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69  ble structure wi
42a0: 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  th all its indic
42b0: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
42c0: 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  eys..*/.void sql
42d0: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
42e0: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
42f0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
4300: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e  onst char *zTabN
4310: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
4320: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a  ;.  FKey *pF1, *
4330: 70 46 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  pF2;.  Db *pDb;.
4340: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
4350: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
4360: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
4370: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
4380: 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61   zTabName && zTa
4390: 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44  bName[0] );.  pD
43a0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
43b0: 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ];.  p = sqlite3
43c0: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
43d0: 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
43e0: 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 0a 20 20 20  h, zTabName,.   
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c       sqlite3Strl
4410: 65 6e 33 30 28 7a 54 61 62 4e 61 6d 65 29 2b 31  en30(zTabName)+1
4420: 2c 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ,0);.  if( p ){.
4430: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4440: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
4450: 20 20 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70      for(pF1=p->p
4460: 46 4b 65 79 3b 20 70 46 31 3b 20 70 46 31 3d 70  FKey; pF1; pF1=p
4470: 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  F1->pNextFrom){.
4480: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20        int nTo = 
4490: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
44a0: 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20  pF1->zTo) + 1;. 
44b0: 20 20 20 20 20 70 46 32 20 3d 20 73 71 6c 69 74       pF2 = sqlit
44c0: 65 33 48 61 73 68 46 69 6e 64 28 26 70 44 62 2d  e3HashFind(&pDb-
44d0: 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c  >pSchema->aFKey,
44e0: 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b   pF1->zTo, nTo);
44f0: 0a 20 20 20 20 20 20 69 66 28 20 70 46 32 3d 3d  .      if( pF2==
4500: 70 46 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pF1 ){.        s
4510: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
4520: 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  (&pDb->pSchema->
4530: 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c  aFKey, pF1->zTo,
4540: 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74   nTo, pF1->pNext
4550: 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  To);.      }else
4560: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
4570: 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70 4e 65   pF2 && pF2->pNe
4580: 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70 46 32  xtTo!=pF1 ){ pF2
4590: 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d  =pF2->pNextTo; }
45a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 32  .        if( pF2
45b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
45c0: 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 46 31  2->pNextTo = pF1
45d0: 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 20  ->pNextTo;.     
45e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
45f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71   }.#endif.    sq
4600: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
4610: 28 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66  (p);.  }.  db->f
4620: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
4630: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
4640: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74  ./*.** Given a t
4650: 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73  oken, return a s
4660: 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69  tring that consi
4670: 73 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20  sts of the text 
4680: 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e  of that.** token
4690: 20 77 69 74 68 20 61 6e 79 20 71 75 6f 74 61 74   with any quotat
46a0: 69 6f 6e 73 20 72 65 6d 6f 76 65 64 2e 20 20 53  ions removed.  S
46b0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
46c0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
46d0: 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
46e0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
46f0: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
4700: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
4710: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
4720: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61  ..**.** Tokens a
4730: 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f  re often just po
4740: 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20  inters into the 
4750: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78  original SQL tex
4760: 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20  t and so.** are 
4770: 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61  not \000 termina
4780: 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20  ted and are not 
4790: 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65  persistent.  The
47a0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
47b0: 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d  .** is \000 term
47c0: 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65  inated and is pe
47d0: 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61  rsistent..*/.cha
47e0: 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72  r *sqlite3NameFr
47f0: 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20  omToken(sqlite3 
4800: 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  *db, Token *pNam
4810: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
4820: 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  e;.  if( pName )
4830: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
4840: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
4850: 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d  b, (char*)pName-
4860: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
4870: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
4880: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  e(zName);.  }els
4890: 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30  e{.    zName = 0
48a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
48b0: 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  Name;.}../*.** O
48c0: 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  pen the sqlite_m
48d0: 61 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72  aster table stor
48e0: 65 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e  ed in database n
48f0: 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a  umber iDb for.**
4900: 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61   writing. The ta
4910: 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73  ble is opened us
4920: 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f  ing cursor 0..*/
4930: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65  .void sqlite3Ope
4940: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72  nMasterTable(Par
4950: 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b  se *p, int iDb){
4960: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
4970: 69 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a  ite3GetVdbe(p);.
4980: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
4990: 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45  ck(p, iDb, MASTE
49a0: 52 5f 52 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d  R_ROOT, 1, SCHEM
49b0: 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20  A_TABLE(iDb));. 
49c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
49d0: 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  p2(v, OP_SetNumC
49e0: 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 2f 2a  olumns, 0, 5);/*
49f0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 68   sqlite_master h
4a00: 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  as 5 columns */.
4a10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4a20: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op3(v, OP_OpenWr
4a30: 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52  ite, 0, MASTER_R
4a40: 4f 4f 54 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a  OOT, iDb);.}../*
4a50: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e  .** Parameter zN
4a60: 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ame points to a 
4a70: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 62  nul-terminated b
4a80: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
4a90: 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
4aa0: 61 20 64 61 74 61 62 61 73 65 20 28 22 6d 61 69  a database ("mai
4ab0: 6e 22 2c 20 22 74 65 6d 70 22 20 6f 72 20 74 68  n", "temp" or th
4ac0: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74  e name of an att
4ad0: 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 0a  ached db). This.
4ae0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
4af0: 72 6e 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66  rns the index of
4b00: 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62   the named datab
4b10: 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  ase in db->aDb[]
4b20: 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68  , or.** -1 if th
4b30: 65 20 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f  e named db canno
4b40: 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69  t be found..*/.i
4b50: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62  nt sqlite3FindDb
4b60: 4e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62  Name(sqlite3 *db
4b70: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
4b80: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
4b90: 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  -1;         /* D
4ba0: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
4bb0: 2f 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  /.  if( zName ){
4bc0: 0a 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  .    Db *pDb;.  
4bd0: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
4be0: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
4bf0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d  ;.    for(i=(db-
4c00: 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62  >nDb-1), pDb=&db
4c10: 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20  ->aDb[i]; i>=0; 
4c20: 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20  i--, pDb--){.   
4c30: 20 20 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45     if( (!OMIT_TE
4c40: 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26  MPDB || i!=1 ) &
4c50: 26 20 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  & n==sqlite3Strl
4c60: 65 6e 33 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29  en30(pDb->zName)
4c70: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30   && .          0
4c80: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
4c90: 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  (pDb->zName, zNa
4ca0: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
4cb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4cc0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4cd0: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   i;.}../*.** The
4ce0: 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f   token *pName co
4cf0: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20  ntains the name 
4d00: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65  of a database (e
4d10: 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a  ither "main" or.
4d20: 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65  ** "temp" or the
4d30: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61   name of an atta
4d40: 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72  ched db). This r
4d50: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
4d60: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74  he.** index of t
4d70: 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  he named databas
4d80: 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20  e in db->aDb[], 
4d90: 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  or -1 if the nam
4da0: 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e  ed db .** does n
4db0: 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74  ot exist..*/.int
4dc0: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73   sqlite3FindDb(s
4dd0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
4de0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  n *pName){.  int
4df0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
4e20: 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mber */.  char *
4e30: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
4e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4e50: 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65  * Name we are se
4e60: 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20  arching for */. 
4e70: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
4e80: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
4e90: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20  , pName);.  i = 
4ea0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
4eb0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
4ec0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4ed0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  , zName);.  retu
4ee0: 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn i;.}../* The 
4ef0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72  table or view or
4f00: 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73   trigger name is
4f10: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
4f20: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
4f30: 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  ns.** pName1 and
4f40: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
4f50: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
4f60: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
4f70: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  for example:.**.
4f80: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
4f90: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a  xxx.yyy (...);.*
4fa0: 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  * .** Then pName
4fb0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
4fc0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
4fd0: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
4fe0: 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20   hand if.** the 
4ff0: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
5000: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
5010: 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43  d, i.e.:.**.** C
5020: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
5030: 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  ...);.**.** Then
5040: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
5050: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
5060: 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20  e2 is ""..**.** 
5070: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
5080: 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20  s the *ppUnqual 
5090: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
50a0: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
50b0: 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d  Name1 or.** pNam
50c0: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
50d0: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
50e0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
50f0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
5100: 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20   database "xxx" 
5110: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
5120: 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61  int sqlite3TwoPa
5130: 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  rtName(.  Parse 
5140: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
5150: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
5160: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
5170: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
5180: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a  *pName1,      /*
5190: 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68   The "xxx" in th
51a0: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
51b0: 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54   or "xxx" */.  T
51c0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
51d0: 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20     /* The "yyy" 
51e0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
51f0: 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  .yyy" */.  Token
5200: 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f   **pUnqual     /
5210: 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75  * Write the unqu
5220: 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e  alified object n
5230: 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ame here */.){. 
5240: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5260: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
5270: 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
5280: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5290: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
52a0: 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d  ( pName2 && pNam
52b0: 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69  e2->n>0 ){.    i
52c0: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
52d0: 20 29 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74   ) {.      sqlit
52e0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
52f0: 65 2c 20 22 63 6f 72 72 75 70 74 20 64 61 74 61  e, "corrupt data
5300: 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20 70 50  base");.      pP
5310: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
5320: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
5330: 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61     }.    *pUnqua
5340: 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20  l = pName2;.    
5350: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
5360: 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b  dDb(db, pName1);
5370: 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
5380: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
5390: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
53a0: 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73  "unknown databas
53b0: 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a  e %T", pName1);.
53c0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
53d0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75  rr++;.      retu
53e0: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn -1;.    }.  }
53f0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
5400: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
5410: 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 || db->init.bu
5420: 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  sy );.    iDb = 
5430: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20  db->init.iDb;.  
5440: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
5450: 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me1;.  }.  retur
5460: 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n iDb;.}../*.** 
5470: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5480: 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  used to check if
5490: 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e   the UTF-8 strin
54a0: 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67  g zName is a leg
54b0: 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65  al.** unqualifie
54c0: 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77  d name for a new
54d0: 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28   schema object (
54e0: 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69  table, index, vi
54f0: 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72  ew or.** trigger
5500: 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65  ). All names are
5510: 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68   legal except th
5520: 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77  ose that begin w
5530: 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a  ith the string.*
5540: 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20  * "sqlite_" (in 
5550: 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20  upper, lower or 
5560: 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69  mixed case). Thi
5570: 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  s portion of the
5580: 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73   namespace.** is
5590: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e   reserved for in
55a0: 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69  ternal use..*/.i
55b0: 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  nt sqlite3CheckO
55c0: 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20  bjectName(Parse 
55d0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
55e0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
55f0: 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e  f( !pParse->db->
5600: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61  init.busy && pPa
5610: 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a  rse->nested==0 .
5620: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50            && (pP
5630: 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
5640: 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  & SQLITE_WriteSc
5650: 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20  hema)==0.       
5660: 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33     && 0==sqlite3
5670: 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  StrNICmp(zName, 
5680: 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b  "sqlite_", 7) ){
5690: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
56a0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62  rMsg(pParse, "ob
56b0: 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76  ject name reserv
56c0: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
56d0: 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  use: %s", zName)
56e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
56f0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
5700: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5710: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  K;.}../*.** Begi
5720: 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61  n constructing a
5730: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65   new table repre
5740: 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d  sentation in mem
5750: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  ory.  This is.**
5760: 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65   the first of se
5770: 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75  veral action rou
5780: 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63  tines that get c
5790: 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73  alled in respons
57a0: 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45  e.** to a CREATE
57b0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
57c0: 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72  .  In particular
57d0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
57e0: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65  s called.** afte
57f0: 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20  r seeing tokens 
5800: 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41  "CREATE" and "TA
5810: 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62  BLE" and the tab
5820: 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54  le name. The isT
5830: 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74  emp.** flag is t
5840: 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  rue if the table
5850: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
5860: 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61  d in the auxilia
5870: 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ry database.** f
5880: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
5890: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
58a0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
58b0: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20  is normally the 
58c0: 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65  case.** when the
58d0: 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50   "TEMP" or "TEMP
58e0: 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f  ORARY" keyword o
58f0: 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e  ccurs in between
5900: 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54  .** CREATE and T
5910: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ABLE..**.** The 
5920: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
5930: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
5940: 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73  and put in pPars
5950: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a  e->pNewTable..**
5960: 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   As more of the 
5970: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
5980: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
5990: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74  , additional act
59a0: 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20  ion.** routines 
59b0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74  will be called t
59c0: 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72  o add more infor
59d0: 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72  mation to this r
59e0: 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65  ecord..** At the
59f0: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
5a00: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
5a10: 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45  nt, the sqlite3E
5a20: 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e  ndTable() routin
5a30: 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74  e.** is called t
5a40: 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63  o complete the c
5a50: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74  onstruction of t
5a60: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
5a70: 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ord..*/.void sql
5a80: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a  ite3StartTable(.
5a90: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5aa0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
5ab0: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
5ac0: 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69  *pName1,   /* Fi
5ad0: 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  rst part of the 
5ae0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
5af0: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54  e or view */.  T
5b00: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
5b10: 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
5b20: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
5b30: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
5b40: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
5b50: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
5b60: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20   this is a TEMP 
5b70: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
5b80: 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54  sView,      /* T
5b90: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
5ba0: 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69   VIEW */.  int i
5bb0: 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54  sVirtual,   /* T
5bc0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
5bd0: 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a   VIRTUAL table *
5be0: 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20  /.  int noErr   
5bf0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
5c00: 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65  ng if table alre
5c10: 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
5c20: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
5c30: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  ;.  char *zName 
5c40: 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65  = 0; /* The name
5c50: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
5c60: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
5c70: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
5c80: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
5c90: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
5ca0: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
5cb0: 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  r to create the 
5cc0: 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f  table in */.  To
5cd0: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f  ken *pName;    /
5ce0: 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
5cf0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
5d00: 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20  to create */..  
5d10: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20  /* The table or 
5d20: 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65  view name to cre
5d30: 61 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ate is passed to
5d40: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
5d50: 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e  a tokens.  ** pN
5d60: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
5d70: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
5d80: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
5d90: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
5da0: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  ple:.  **.  ** C
5db0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
5dc0: 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20  yyy (...);.  ** 
5dd0: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
5de0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
5df0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
5e00: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
5e10: 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68   hand if.  ** th
5e20: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20  e table name is 
5e30: 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  not fully qualif
5e40: 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a  ied, i.e.:.  **.
5e50: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
5e60: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a  E yyy(...);.  **
5e70: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
5e80: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
5e90: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
5ea0: 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ""..  **.  ** Th
5eb0: 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74  e call below set
5ec0: 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e  s the pName poin
5ed0: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
5ee0: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
5ef0: 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32  1 or.  ** pName2
5f00: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
5f10: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
5f20: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61  ble name. The va
5f30: 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20  riable iDb is.  
5f40: 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  ** set to the in
5f50: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
5f60: 61 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62  ase that the tab
5f70: 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f  le or view is to
5f80: 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64   be.  ** created
5f90: 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20   in..  */.  iDb 
5fa0: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
5fb0: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
5fc0: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
5fd0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
5fe0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
5ff0: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
6000: 26 20 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e  & isTemp && iDb>
6010: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63  1 ){.    /* If c
6020: 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74  reating a temp t
6030: 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d  able, the name m
6040: 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66  ay not be qualif
6050: 69 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ied */.    sqlit
6060: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6070: 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61  e, "temporary ta
6080: 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  ble name must be
6090: 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a   unqualified");.
60a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
60b0: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
60c0: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69  DB && isTemp ) i
60d0: 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73  Db = 1;..  pPars
60e0: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20  e->sNameToken = 
60f0: 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20  *pName;.  zName 
6100: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
6110: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65  mToken(db, pName
6120: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
6130: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
6140: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
6150: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
6160: 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
6170: 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62  e) ){.    goto b
6180: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6190: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
61a0: 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73  init.iDb==1 ) is
61b0: 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65  Temp = 1;.#ifnde
61c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
61d0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73  THORIZATION.  as
61e0: 73 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20  sert( (isTemp & 
61f0: 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20  1)==isTemp );.  
6200: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
6210: 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20      char *zDb = 
6220: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
6230: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
6240: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
6250: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
6260: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
6270: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
6280: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
6290: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
62a0: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
62b0: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
62c0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
62d0: 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20  B && isTemp ){. 
62e0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
62f0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
6300: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
6310: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
6320: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
6330: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20  _VIEW;.      }. 
6340: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6350: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
6360: 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20   && isTemp ){.  
6370: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
6380: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
6390: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
63a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
63b0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
63c0: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
63d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69      }.    if( !i
63e0: 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69  sVirtual && sqli
63f0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
6400: 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65  rse, code, zName
6410: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
6420: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
6430: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
6440: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
6450: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
6460: 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64  new table name d
6470: 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20  oes not collide 
6480: 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67  with an existing
6490: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
64a0: 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65  able name in the
64b0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20   same database. 
64c0: 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20   Issue an error 
64d0: 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20  message if.  ** 
64e0: 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63  it does. The exc
64f0: 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65  eption is if the
6500: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
6510: 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73   parsed was pass
6520: 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71  ed.  ** to an sq
6530: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
6540: 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68  ab() call. In th
6550: 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65  at case only the
6560: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
6570: 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c  ** and types wil
6580: 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68  l be used, so th
6590: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
65a0: 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73  o test for names
65b0: 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73  pace.  ** collis
65c0: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
65d0: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
65e0: 42 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  B ){.    if( SQL
65f0: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
6600: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
6610: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
6620: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
6630: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  r;.    }.    pTa
6640: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ble = sqlite3Fin
6650: 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
6660: 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  , db->aDb[iDb].z
6670: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
6680: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  Table ){.      i
6690: 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20  f( !noErr ){.   
66a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
66b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
66c0: 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65  ble %T already e
66d0: 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a  xists", pName);.
66e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
66f0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6700: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
6710: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
6720: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
6730: 30 29 21 3d 30 20 26 26 20 28 69 44 62 3d 3d 30  0)!=0 && (iDb==0
6740: 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75   || !db->init.bu
6750: 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sy) ){.      sql
6760: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6770: 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
6780: 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20  lready an index 
6790: 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
67a0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  );.      goto be
67b0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
67c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54  .    }.  }..  pT
67d0: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62  able = sqlite3Db
67e0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
67f0: 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
6800: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
6810: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
6820: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
6830: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
6840: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70  ITE_NOMEM;.    p
6850: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
6860: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
6870: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
6880: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
6890: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
68a0: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
68b0: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
68c0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
68d0: 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65  Schema;.  pTable
68e0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54  ->nRef = 1;.  pT
68f0: 61 62 6c 65 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  able->db = db;. 
6900: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65   if( pParse->pNe
6910: 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33  wTable ) sqlite3
6920: 44 65 6c 65 74 65 54 61 62 6c 65 28 70 50 61 72  DeleteTable(pPar
6930: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a  se->pNewTable);.
6940: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
6950: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20  ble = pTable;.. 
6960: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
6970: 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f  he magic sqlite_
6980: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75  sequence table u
6990: 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65  sed by autoincre
69a0: 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  ment,.  ** then 
69b0: 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72  record a pointer
69c0: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69   to this table i
69d0: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
69e0: 61 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  ase structure.  
69f0: 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52  ** so that INSER
6a00: 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74  T can find the t
6a10: 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a  able easily..  *
6a20: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
6a30: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
6a40: 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73  ENT.  if( !pPars
6a50: 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72  e->nested && str
6a60: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  cmp(zName, "sqli
6a70: 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30  te_sequence")==0
6a80: 20 29 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e   ){.    pTable->
6a90: 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62  pSchema->pSeqTab
6aa0: 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23   = pTable;.  }.#
6ab0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69  endif..  /* Begi
6ac0: 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65  n generating the
6ad0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
6ae0: 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65  insert the table
6af0: 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a   record into.  *
6b00: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  * the SQLITE_MAS
6b10: 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65  TER table.  Note
6b20: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
6b30: 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61  hat we must go a
6b40: 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c  head.  ** and al
6b50: 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72  locate the recor
6b60: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
6b70: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77   table entry now
6b80: 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20  .  Before any.  
6b90: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ** PRIMARY KEY o
6ba0: 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64  r UNIQUE keyword
6bb0: 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54  s are parsed.  T
6bc0: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69  hose keywords wi
6bd0: 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e  ll cause.  ** in
6be0: 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61  dices to be crea
6bf0: 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c  ted and the tabl
6c00: 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f  e record must co
6c10: 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20  me before the . 
6c20: 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65   ** indices.  He
6c30: 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20  nce, the record 
6c40: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
6c50: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c  able must be all
6c60: 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e  ocated.  ** now.
6c70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
6c80: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76  >init.busy && (v
6c90: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
6ca0: 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b  e(pParse))!=0 ){
6cb0: 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20  .    int j1;.   
6cc0: 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b   int fileFormat;
6cd0: 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72  .    int reg1, r
6ce0: 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 73  eg2, reg3;.    s
6cf0: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
6d00: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
6d10: 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  , 0, iDb);..#ifn
6d20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6d30: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
6d40: 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20 29   if( isVirtual )
6d50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6d60: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
6d70: 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23  VBegin);.    }.#
6d80: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
6d90: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
6da0: 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e   and encoding in
6db0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
6dc0: 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c  ve not been set,
6dd0: 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65   .    ** set the
6de0: 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  m now..    */.  
6df0: 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d    reg1 = pParse-
6e00: 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50  >regRowid = ++pP
6e10: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
6e20: 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72  reg2 = pParse->r
6e30: 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73  egRoot = ++pPars
6e40: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
6e50: 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  3 = ++pParse->nM
6e60: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
6e70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6e80: 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  ReadCookie, iDb,
6e90: 20 72 65 67 33 2c 20 31 29 3b 20 20 20 2f 2a 20   reg3, 1);   /* 
6ea0: 66 69 6c 65 5f 66 6f 72 6d 61 74 20 2a 2f 0a 20  file_format */. 
6eb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
6ec0: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
6ed0: 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  .    j1 = sqlite
6ee0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6ef0: 50 5f 49 66 2c 20 72 65 67 33 29 3b 0a 20 20 20  P_If, reg3);.   
6f00: 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64   fileFormat = (d
6f10: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
6f20: 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29  E_LegacyFileFmt)
6f30: 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20  !=0 ?.          
6f40: 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49          1 : SQLI
6f50: 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d  TE_MAX_FILE_FORM
6f60: 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  AT;.    sqlite3V
6f70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6f80: 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46 6f 72  Integer, fileFor
6f90: 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  mat, reg3);.    
6fa0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6fb0: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
6fc0: 65 2c 20 69 44 62 2c 20 31 2c 20 72 65 67 33 29  e, iDb, 1, reg3)
6fd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6fe0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
6ff0: 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29 2c 20  teger, ENC(db), 
7000: 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg3);.    sqlit
7010: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7020: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
7030: 62 2c 20 34 2c 20 72 65 67 33 29 3b 0a 20 20 20  b, 4, reg3);.   
7040: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
7050: 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20  Here(v, j1);..  
7060: 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63    /* This just c
7070: 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68  reates a place-h
7080: 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20  older record in 
7090: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
70a0: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  r table..    ** 
70b0: 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74  The record creat
70c0: 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ed does not cont
70d0: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74  ain anything yet
70e0: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65  .  It will be re
70f0: 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  placed.    ** by
7100: 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20   the real entry 
7110: 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  in code generate
7120: 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  d at sqlite3EndT
7130: 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  able()..    **. 
7140: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
7150: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
7160: 79 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65  y is left on the
7170: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
7180: 6b 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  k..    ** The ro
7190: 77 69 64 20 76 61 6c 75 65 20 69 73 20 6e 65 65  wid value is nee
71a0: 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20  ded by the code 
71b0: 74 68 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  that sqlite3EndT
71c0: 61 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  able will.    **
71d0: 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a   generate..    *
71e0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
71f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
7200: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
7210: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
7220: 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69  TABLE).    if( i
7230: 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75  sView || isVirtu
7240: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
7250: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7260: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
7270: 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65  reg2);.    }else
7280: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
7290: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
72a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61  ddOp2(v, OP_Crea
72b0: 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20 72 65  teTable, iDb, re
72c0: 67 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  g2);.    }.    s
72d0: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
72e0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  Table(pParse, iD
72f0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
7300: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7310: 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65 67  NewRowid, 0, reg
7320: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
7330: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7340: 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a  Null, 0, reg3);.
7350: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7360: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
7370: 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67  rt, 0, reg3, reg
7380: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
7390: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
73a0: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
73b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
73c0: 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp0(v, OP_Close
73d0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72  );.  }..  /* Nor
73e0: 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20  mal (non-error) 
73f0: 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74  return. */.  ret
7400: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  urn;..  /* If an
7410: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77   error occurs, w
7420: 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62  e jump here */.b
7430: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7440: 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
7450: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
7460: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
7470: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75   This macro is u
7480: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74  sed to compare t
7490: 77 6f 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20  wo strings in a 
74a0: 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65  case-insensitive
74b0: 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69   manner..** It i
74c0: 73 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65  s slightly faste
74d0: 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73  r than calling s
74e0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 29 20  qlite3StrICmp() 
74f0: 64 69 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a  directly, but.**
7500: 20 70 72 6f 64 75 63 65 73 20 6c 61 72 67 65 72   produces larger
7510: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52   code..**.** WAR
7520: 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61 63 72 6f  NING: This macro
7530: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62   is not compatib
7540: 6c 65 20 77 69 74 68 20 74 68 65 20 73 74 72 63  le with the strc
7550: 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a  mp() family. It.
7560: 2a 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65 20  ** returns true 
7570: 69 66 20 74 68 65 20 74 77 6f 20 73 74 72 69 6e  if the two strin
7580: 67 73 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 74  gs are equal, ot
7590: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
75a0: 2f 0a 23 64 65 66 69 6e 65 20 53 54 52 49 43 4d  /.#define STRICM
75b0: 50 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74  P(x, y) (\.sqlit
75c0: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  e3UpperToLower[*
75d0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
75e0: 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69  )(x)]==   \.sqli
75f0: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
7600: 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  *(unsigned char 
7610: 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a 26 26 20  *)(y)]     \.&& 
7620: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 28  sqlite3StrICmp((
7630: 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29  x)+1,(y)+1)==0 )
7640: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
7650: 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20  w column to the 
7660: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
7670: 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
7680: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  d..**.** The par
7690: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
76a0: 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20  outine once for 
76b0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  each column decl
76c0: 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20  aration.** in a 
76d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
76e0: 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33  tement.  sqlite3
76f0: 53 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74  StartTable() get
7700: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73  s called.** firs
7710: 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20  t to get things 
7720: 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69  going.  Then thi
7730: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7740: 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  led for each.** 
7750: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  column..*/.void 
7760: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
7770: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7780: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
7790: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
77a0: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
77b0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
77c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
77d0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
77e0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
77f0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
7800: 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45  turn;.#if SQLITE
7810: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
7820: 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e  ( p->nCol+1>db->
7830: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7840: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
7850: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7860: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
7870: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20  many columns on 
7880: 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  %s", p->zName);.
7890: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
78a0: 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c  #endif.  z = sql
78b0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
78c0: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
78d0: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
78e0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
78f0: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
7900: 20 20 20 69 66 28 20 53 54 52 49 43 4d 50 28 7a     if( STRICMP(z
7910: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
7920: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  me) ){.      sql
7930: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7940: 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20  rse, "duplicate 
7950: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22  column name: %s"
7960: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
7970: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
7980: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
7990: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
79a0: 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d  (p->nCol & 0x7)=
79b0: 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e  =0 ){.    Column
79c0: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77   *aNew;.    aNew
79d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
79e0: 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28  loc(db,p->aCol,(
79f0: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
7a00: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
7a10: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
7a20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7a30: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
7a40: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
7a50: 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d   }.    p->aCol =
7a60: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
7a70: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
7a80: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
7a90: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
7aa0: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
7ab0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
7ac0: 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  . .  /* If there
7ad0: 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63   is no type spec
7ae0: 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68  ified, columns h
7af0: 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  ave the default 
7b00: 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e  affinity.  ** 'N
7b10: 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69  ONE'. If there i
7b20: 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69  s a type specifi
7b30: 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33  ed, then sqlite3
7b40: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20  AddColumnType() 
7b50: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c  will.  ** be cal
7b60: 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20  led next to set 
7b70: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63  pCol->affinity c
7b80: 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  orrectly..  */. 
7b90: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
7ba0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
7bb0: 45 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a  E;.  p->nCol++;.
7bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
7bd0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
7be0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
7bf0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
7c00: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
7c10: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
7c20: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
7c30: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
7c40: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
7c50: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
7c60: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
7c70: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
7c80: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
7c90: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
7ca0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
7cb0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
7cc0: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  te3AddNotNull(Pa
7cd0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
7ce0: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
7cf0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
7d00: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
7d10: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
7d20: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
7d30: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
7d40: 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c  ( i>=0 ) p->aCol
7d50: 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75  [i].notNull = (u
7d60: 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a  8)onError;.}../*
7d70: 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c  .** Scan the col
7d80: 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54  umn type name zT
7d90: 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70  ype (length nTyp
7da0: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  e) and return th
7db0: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
7dc0: 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a  affinity type..*
7dd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7de0: 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e  e does a case-in
7df0: 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68  dependent search
7e00: 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68   of zType for th
7e10: 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73  e .** substrings
7e20: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
7e30: 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20  g table. If one 
7e40: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
7e50: 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74  s is.** found, t
7e60: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
7e70: 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74   affinity is ret
7e80: 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20  urned. If zType 
7e90: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65  contains.** more
7ea0: 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65   than one of the
7eb0: 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74   substrings, ent
7ec0: 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20  ries toward the 
7ed0: 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74  top of .** the t
7ee0: 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69  able take priori
7ef0: 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ty. For example,
7f00: 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c   if zType is 'BL
7f10: 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49  OBINT', .** SQLI
7f20: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69  TE_AFF_INTEGER i
7f30: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
7f40: 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20  * Substring     
7f50: 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d  | Affinity.** --
7f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
7f80: 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20  * 'INT'         
7f90: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  | SQLITE_AFF_INT
7fa0: 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20  EGER.** 'CHAR'  
7fb0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7fc0: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42  FF_TEXT.** 'CLOB
7fd0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7fe0: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54  E_AFF_TEXT.** 'T
7ff0: 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51  EXT'        | SQ
8000: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
8010: 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'BLOB'        |
8020: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
8030: 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20  .** 'REAL'      
8040: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
8050: 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20  EAL.** 'FLOA'   
8060: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
8070: 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27  F_REAL.** 'DOUB'
8080: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8090: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20  _AFF_REAL.**.** 
80a0: 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  If none of the s
80b0: 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  ubstrings in the
80c0: 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65   above table are
80d0: 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54   found,.** SQLIT
80e0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73  E_AFF_NUMERIC is
80f0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68   returned..*/.ch
8100: 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69  ar sqlite3Affini
8110: 74 79 54 79 70 65 28 63 6f 6e 73 74 20 54 6f 6b  tyType(const Tok
8120: 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 75 33  en *pType){.  u3
8130: 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  2 h = 0;.  char 
8140: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
8150: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73  _NUMERIC;.  cons
8160: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
8170: 2a 7a 49 6e 20 3d 20 70 54 79 70 65 2d 3e 7a 3b  *zIn = pType->z;
8180: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
8190: 64 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26  d char *zEnd = &
81a0: 70 54 79 70 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e  pType->z[pType->
81b0: 6e 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49  n];..  while( zI
81c0: 6e 21 3d 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68  n!=zEnd ){.    h
81d0: 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69   = (h<<8) + sqli
81e0: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
81f0: 2a 7a 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b  *zIn];.    zIn++
8200: 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27  ;.    if( h==(('
8210: 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36  c'<<24)+('h'<<16
8220: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20  )+('a'<<8)+'r') 
8230: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){             /
8240: 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20  * CHAR */.      
8250: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
8260: 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73  _TEXT; .    }els
8270: 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c  e if( h==(('c'<<
8280: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
8290: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20  o'<<8)+'b') ){  
82a0: 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a       /* CLOB */.
82b0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
82c0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
82d0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
82e0: 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  't'<<24)+('e'<<1
82f0: 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29  6)+('x'<<8)+'t')
8300: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58   ){       /* TEX
8310: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
8320: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
8330: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8340: 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27  h==(('b'<<24)+('
8350: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
8360: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
8370: 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * BLOB */.      
8380: 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
8390: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c  E_AFF_NUMERIC ||
83a0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
83b0: 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  _REAL) ){.      
83c0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
83d0: 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53  _NONE;.#ifndef S
83e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
83f0: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65  ING_POINT.    }e
8400: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27  lse if( h==(('r'
8410: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
8420: 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20  ('a'<<8)+'l')   
8430: 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a         /* REAL *
8440: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
8450: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
8460: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
8470: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
8480: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
8490: 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29  f( h==(('f'<<24)
84a0: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
84b0: 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20  <8)+'a')        
84c0: 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20    /* FLOA */.   
84d0: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
84e0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
84f0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
8500: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
8510: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
8520: 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27  =(('d'<<24)+('o'
8530: 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27  <<16)+('u'<<8)+'
8540: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
8550: 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  DOUB */.        
8560: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
8570: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
8580: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
8590: 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69  _AFF_REAL;.#endi
85a0: 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  f.    }else if( 
85b0: 28 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d  (h&0x00FFFFFF)==
85c0: 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c  (('i'<<16)+('n'<
85d0: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f  <8)+'t') ){    /
85e0: 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61  * INT */.      a
85f0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8600: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62  INTEGER;.      b
8610: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
8620: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
8630: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8640: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
8650: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
8660: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
8670: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
8680: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
8690: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46  atement.  The pF
86a0: 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68  irst token is th
86b0: 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e  e first.** token
86c0: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
86d0: 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20   of tokens that 
86e0: 64 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70  describe the typ
86f0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75  e of the.** colu
8700: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
8710: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
8720: 20 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20     pLast is the 
8730: 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e  last token.** in
8740: 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20   the sequence.  
8750: 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61  Use this informa
8760: 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63  tion to construc
8770: 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68  t a string.** th
8780: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
8790: 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20  typename of the 
87a0: 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65  column and store
87b0: 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20   that string.** 
87c0: 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f  in zType..*/ .vo
87d0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
87e0: 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70  umnType(Parse *p
87f0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
8800: 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ype){.  Table *p
8810: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c  ;.  int i;.  Col
8820: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c  umn *pCol;.  sql
8830: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
8840: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
8850: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
8860: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
8870: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30  Col-1;.  if( i<0
8880: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
8890: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b  l = &p->aCol[i];
88a0: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
88b0: 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  db;.  sqlite3DbF
88c0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54  ree(db, pCol->zT
88d0: 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54  ype);.  pCol->zT
88e0: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ype = sqlite3Nam
88f0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
8900: 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61  Type);.  pCol->a
8910: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
8920: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 54  3AffinityType(pT
8930: 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ype);.}../*.** T
8940: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
8950: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
8960: 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  ue for the most 
8970: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
8980: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  olumn.** of the 
8990: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
89a0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
89b0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c  on..**.** Defaul
89c0: 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69  t value expressi
89d0: 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73  ons must be cons
89e0: 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20  tant.  Raise an 
89f0: 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69  exception if thi
8a00: 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20  s.** is not the 
8a10: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  case..**.** This
8a20: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8a30: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
8a40: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
8a50: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
8a60: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
8a70: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  E statement..*/.
8a80: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44  void sqlite3AddD
8a90: 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73  efaultValue(Pars
8aa0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
8ab0: 2a 70 45 78 70 72 29 7b 0a 20 20 54 61 62 6c 65  *pExpr){.  Table
8ac0: 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *p;.  Column *p
8ad0: 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
8ae0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8af0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
8b00: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 21 3d  se->pNewTable)!=
8b10: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20  0 ){.    pCol = 
8b20: 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f  &(p->aCol[p->nCo
8b30: 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21  l-1]);.    if( !
8b40: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
8b50: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
8b60: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
8b70: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8b80: 70 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74  pParse, "default
8b90: 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e   value of column
8ba0: 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e   [%s] is not con
8bb0: 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20  stant",.        
8bc0: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a    pCol->zName);.
8bd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8be0: 20 45 78 70 72 20 2a 70 43 6f 70 79 3b 0a 20 20   Expr *pCopy;.  
8bf0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
8c00: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  elete(db, pCol->
8c10: 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43  pDflt);.      pC
8c20: 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 70 43 6f 70  ol->pDflt = pCop
8c30: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  y = sqlite3ExprD
8c40: 75 70 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  up(db, pExpr);. 
8c50: 20 20 20 20 20 69 66 28 20 70 43 6f 70 79 20 29       if( pCopy )
8c60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8c70: 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26  3TokenCopy(db, &
8c80: 70 43 6f 70 79 2d 3e 73 70 61 6e 2c 20 26 70 45  pCopy->span, &pE
8c90: 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  xpr->span);.    
8ca0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
8cb0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8cc0: 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  e(db, pExpr);.}.
8cd0: 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65  ./*.** Designate
8ce0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
8cf0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
8d00: 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
8d10: 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66   of names .** of
8d20: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f   columns that fo
8d30: 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  rm the primary k
8d40: 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  ey.  If pList is
8d50: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a   NULL, then the.
8d60: 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  ** most recently
8d70: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66   added column of
8d80: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68   the table is th
8d90: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a  e primary key..*
8da0: 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e  *.** A table can
8db0: 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e   have at most on
8dc0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
8dd0: 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  If the table alr
8de0: 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72  eady has.** a pr
8df0: 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74  imary key (and t
8e00: 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e  his is the secon
8e10: 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74  d primary key) t
8e20: 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a  hen create an.**
8e30: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66   error..**.** If
8e40: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
8e50: 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20   is on a single 
8e60: 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74  column whose dat
8e70: 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52  atype is INTEGER
8e80: 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c  ,.** then we wil
8e90: 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61  l try to use tha
8ea0: 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20  t column as the 
8eb0: 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20  rowid.  Set the 
8ec0: 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66  Table.iPKey.** f
8ed0: 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c  ield of the tabl
8ee0: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
8ef0: 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69  tion to be the i
8f00: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49  ndex of the.** I
8f10: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
8f20: 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c  EY column.  Tabl
8f30: 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74  e.iPKey is set t
8f40: 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73  o -1 if there is
8f50: 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50  .** no INTEGER P
8f60: 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a  RIMARY KEY..**.*
8f70: 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20  * If the key is 
8f80: 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
8f90: 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e  RIMARY KEY, then
8fa0: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
8fb0: 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68  .** index for th
8fc0: 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78  e key.  No index
8fd0: 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20   is created for 
8fe0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
8ff0: 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  KEYs..*/.void sq
9000: 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b  lite3AddPrimaryK
9010: 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
9020: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
9030: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
9040: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
9050: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65    /* List of fie
9060: 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69  ld names to be i
9070: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
9080: 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
9090: 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
90a0: 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f   a uniqueness co
90b0: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20  nflict */.  int 
90c0: 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a  autoInc,      /*
90d0: 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54   True if the AUT
90e0: 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f  OINCREMENT keywo
90f0: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
9100: 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
9110: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53       /* SQLITE_S
9120: 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f  O_ASC or SQLITE_
9130: 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  SO_DESC */.){.  
9140: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
9150: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
9160: 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  .  char *zType =
9170: 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d   0;.  int iCol =
9180: 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54   -1, i;.  if( pT
9190: 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c  ab==0 || IN_DECL
91a0: 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20  ARE_VTAB ) goto 
91b0: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
91c0: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61  ;.  if( pTab->ta
91d0: 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50  bFlags & TF_HasP
91e0: 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20  rimaryKey ){.   
91f0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9200: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
9210: 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61  "table \"%s\" ha
9220: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
9230: 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54  primary key", pT
9240: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
9250: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
9260: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61  _exit;.  }.  pTa
9270: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
9280: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b  F_HasPrimaryKey;
9290: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
92a0: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
92b0: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
92c0: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
92d0: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
92e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
92f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
9300: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
9310: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
9320: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
9330: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
9340: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
9350: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
9360: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  .zName, pTab->aC
9370: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d  ol[iCol].zName)=
9380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
9390: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
93a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
93b0: 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  f( iCol<pTab->nC
93c0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  ol ){.        pT
93d0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69  ab->aCol[iCol].i
93e0: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
93f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9400: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
9410: 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a  >1 ) iCol = -1;.
9420: 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
9430: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
9440: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70  nCol ){.    zTyp
9450: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
9460: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a  Col].zType;.  }.
9470: 20 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 73    if( zType && s
9480: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
9490: 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d  ype, "INTEGER")=
94a0: 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 73 6f  =0.        && so
94b0: 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f  rtOrder==SQLITE_
94c0: 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 70 54  SO_ASC ){.    pT
94d0: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c  ab->iPKey = iCol
94e0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43  ;.    pTab->keyC
94f0: 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  onf = (u8)onErro
9500: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  r;.    assert( a
9510: 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74  utoInc==0 || aut
9520: 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70  oInc==1 );.    p
9530: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
9540: 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f   autoInc*TF_Auto
9550: 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 7d 65 6c  increment;.  }el
9560: 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29  se if( autoInc )
9570: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
9580: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
9590: 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ENT.    sqlite3E
95a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
95b0: 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69  "AUTOINCREMENT i
95c0: 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f  s only allowed o
95d0: 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49  n an ".       "I
95e0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
95f0: 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  EY");.#endif.  }
9600: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
9610: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
9620: 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c  rse, 0, 0, 0, pL
9630: 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ist, onError, 0,
9640: 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30   0, sortOrder, 0
9650: 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30  );.    pList = 0
9660: 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b  ;.  }..primary_k
9670: 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ey_exit:.  sqlit
9680: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
9690: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69  (pParse->db, pLi
96a0: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  st);.  return;.}
96b0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
96c0: 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  w CHECK constrai
96d0: 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  nt to the table 
96e0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
96f0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
9700: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
9710: 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28  CheckConstraint(
9720: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9730: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
9740: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
9750: 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f  r *pCheckExpr  /
9760: 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72  * The check expr
9770: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73  ession */.){.  s
9780: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9790: 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66  rse->db;.#ifndef
97a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
97b0: 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  CK.  Table *pTab
97c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
97d0: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62  able;.  if( pTab
97e0: 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f   && !IN_DECLARE_
97f0: 56 54 41 42 20 29 7b 0a 20 20 20 20 2f 2a 20 54  VTAB ){.    /* T
9800: 68 65 20 43 48 45 43 4b 20 65 78 70 72 65 73 73  he CHECK express
9810: 69 6f 6e 20 6d 75 73 74 20 62 65 20 64 75 70 6c  ion must be dupl
9820: 69 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  icated so that t
9830: 6f 6b 65 6e 73 20 72 65 66 65 72 0a 20 20 20 20  okens refer.    
9840: 2a 2a 20 74 6f 20 6d 61 6c 6c 6f 63 65 64 20 73  ** to malloced s
9850: 70 61 63 65 20 61 6e 64 20 6e 6f 74 20 74 68 65  pace and not the
9860: 20 28 65 70 68 65 6d 65 72 61 6c 29 20 74 65 78   (ephemeral) tex
9870: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
9880: 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 73 74 61  TABLE.    ** sta
9890: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 70 54  tement */.    pT
98a0: 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c  ab->pCheck = sql
98b0: 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
98c0: 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 0a 20  pTab->pCheck, . 
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9900: 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 29  db, pCheckExpr))
9910: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
9920: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
9930: 28 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29  (db, pCheckExpr)
9940: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
9950: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  he collation fun
9960: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ction of the mos
9970: 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
9980: 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a  d table column.*
9990: 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71  * to the CollSeq
99a0: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
99b0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74  sqlite3AddCollat
99c0: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
99d0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
99e0: 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  en){.  Table *p;
99f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
9a00: 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
9a10: 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65        /* Dequote
9a20: 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74  d name of collat
9a30: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ion sequence */.
9a40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
9a50: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
9a60: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
9a70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
9a80: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62   p->nCol-1;.  db
9a90: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
9aa0: 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
9ab0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
9ac0: 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  , pToken);.  if(
9ad0: 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e   !zColl ) return
9ae0: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
9af0: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
9b00: 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29  arse, zColl, -1)
9b10: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
9b20: 49 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c  Idx;.    p->aCol
9b30: 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c  [i].zColl = zCol
9b40: 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  l;.  .    /* If 
9b50: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65  the column is de
9b60: 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65  clared as "<name
9b70: 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f  > PRIMARY KEY CO
9b80: 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20  LLATE <type>",. 
9b90: 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e     ** then an in
9ba0: 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65  dex may have bee
9bb0: 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69  n created on thi
9bc0: 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20  s column before 
9bd0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61  the.    ** colla
9be0: 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64  tion type was ad
9bf0: 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69  ded. Correct thi
9c00: 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63  s if it is the c
9c10: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
9c20: 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
9c30: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
9c40: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
9c50: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
9c60: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20  >nColumn==1 );. 
9c70: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
9c80: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b  iColumn[0]==i ){
9c90: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
9ca0: 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43  zColl[0] = p->aC
9cb0: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[i].zColl;.   
9cc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
9cd0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
9ce0: 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
9cf0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
9d00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
9d10: 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  urns the collati
9d20: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
9d30: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
9d40: 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67  text.** encoding
9d50: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
9d60: 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c  he string zName,
9d70: 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a   length nName..*
9d80: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
9d90: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ested collation 
9da0: 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20  sequence is not 
9db0: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f  available, or no
9dc0: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69  t available.** i
9dd0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  n the database n
9de0: 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20  ative encoding, 
9df0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
9e00: 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64  ctory is invoked
9e10: 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69   to.** request i
9e20: 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  t. If the collat
9e30: 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73  ion factory does
9e40: 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68   not supply such
9e50: 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20   a sequence,.** 
9e60: 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65  and the sequence
9e70: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
9e80: 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e   another text en
9e90: 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61  coding, then tha
9ea0: 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  t is.** returned
9eb0: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
9ec0: 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f  If no versions o
9ed0: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
9ee0: 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65  collations seque
9ef0: 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c  nce are availabl
9f00: 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72  e, or.** another
9f10: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
9f20: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
9f30: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
9f40: 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74  sage written int
9f50: 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  o.** pParse..**.
9f60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9f70: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
9f80: 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43  und sqlite3FindC
9f90: 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20  ollSeq().  This 
9fa0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b  routine.** invok
9fb0: 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
9fc0: 20 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20   factory if the 
9fd0: 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  named collation 
9fe0: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a  cannot be found.
9ff0: 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ** and generates
a000: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
a010: 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  e..*/.CollSeq *s
a020: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
a030: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
a040: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
a050: 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29  Name, int nName)
a060: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
a070: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
a080: 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
a090: 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20  ;.  u8 initbusy 
a0a0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b  = db->init.busy;
a0b0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
a0c0: 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  l;..  pColl = sq
a0d0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
a0e0: 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c  (db, enc, zName,
a0f0: 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79   nName, initbusy
a100: 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75  );.  if( !initbu
a110: 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c  sy && (!pColl ||
a120: 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29   !pColl->xCmp) )
a130: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
a140: 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
a150: 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65  db, pColl, zName
a160: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , nName);.    if
a170: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
a180: 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 7b    if( nName<0 ){
a190: 0a 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d  .        nName =
a1a0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 28 64   sqlite3Strlen(d
a1b0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
a1c0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a1d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a1e0: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74   "no such collat
a1f0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 2e  ion sequence: %.
a200: 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d  *s", nName, zNam
a210: 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20  e);.      pColl 
a220: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
a230: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
a240: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
a250: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
a260: 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  l increment the 
a270: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a  schema cookie..*
a280: 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20  *.** The schema 
a290: 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74  cookie is used t
a2a0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e  o determine when
a2b0: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
a2c0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
a2d0: 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20  changes.  After 
a2e0: 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e  each schema chan
a2f0: 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ge, the cookie v
a300: 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  alue.** changes.
a310: 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73    When a process
a320: 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65   first reads the
a330: 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72   schema it recor
a340: 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  ds the.** cookie
a350: 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77  .  Thereafter, w
a360: 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20  henever it goes 
a370: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
a380: 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68  tabase,.** it ch
a390: 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  ecks the cookie 
a3a0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
a3b0: 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20   schema has not 
a3c0: 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65  changed.** since
a3d0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61   it was last rea
a3e0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c  d..**.** This pl
a3f0: 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65  an is not comple
a400: 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f  tely bullet-proo
a410: 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62  f.  It is possib
a420: 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63  le for.** the sc
a430: 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d  hema to change m
a440: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e  ultiple times an
a450: 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65  d for the cookie
a460: 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61   to be.** set ba
a470: 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75  ck to prior valu
a480: 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63  e.  But schema c
a490: 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65  hanges are infre
a4a0: 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65  quent.** and the
a4b0: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
a4c0: 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65  hitting the same
a4d0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73   cookie value is
a4e0: 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63   only.** 1 chanc
a4f0: 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77  e in 2^32.  So w
a500: 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68  e're safe enough
a510: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a520: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61  3ChangeCookie(Pa
a530: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
a540: 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 72 31 20   iDb){.  int r1 
a550: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
a560: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
a570: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a580: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
a590: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
a5a0: 62 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  be;.  sqlite3Vdb
a5b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
a5c0: 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69  teger, db->aDb[i
a5d0: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68  Db].pSchema->sch
a5e0: 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72 31  ema_cookie+1, r1
a5f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
a600: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
a610: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 2c 20  Cookie, iDb, 0, 
a620: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  r1);.  sqlite3Re
a630: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
a640: 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a  rse, r1);.}../*.
a650: 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e  ** Measure the n
a660: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
a670: 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75  ers needed to ou
a680: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a  tput the given.*
a690: 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54  * identifier.  T
a6a0: 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
a6b0: 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20  ed includes any 
a6c0: 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62  quotes used.** b
a6d0: 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  ut does not incl
a6e0: 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72  ude the null ter
a6f0: 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  minator..**.** T
a700: 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  he estimate is c
a710: 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74  onservative.  It
a720: 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
a730: 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a   that what is.**
a740: 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a   really needed..
a750: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
a760: 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  entLength(const 
a770: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
a780: 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a  n;.  for(n=0; *z
a790: 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20  ; n++, z++){.   
a7a0: 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20   if( *z=='"' ){ 
a7b0: 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  n++; }.  }.  ret
a7c0: 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a  urn n + 2;.}../*
a7d0: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65  .** Write an ide
a7e0: 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65  ntifier onto the
a7f0: 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65   end of the give
a800: 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a  n string.  Add.*
a810: 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  * quote characte
a820: 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f  rs as needed..*/
a830: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65  .static void ide
a840: 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69  ntPut(char *z, i
a850: 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a  nt *pIdx, char *
a860: 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20  zSignedIdent){. 
a870: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
a880: 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e  zIdent = (unsign
a890: 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64  ed char*)zSigned
a8a0: 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20  Ident;.  int i, 
a8b0: 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20  j, needQuote;.  
a8c0: 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72  i = *pIdx;.  for
a8d0: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
a8e0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   j++){.    if( !
a8f0: 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
a900: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
a910: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
a920: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
a930: 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a  uote =  zIdent[j
a940: 5d 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 49  ]!=0 || sqlite3I
a950: 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d  sdigit(zIdent[0]
a960: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
a970: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65      || sqlite3Ke
a980: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
a990: 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69  , j)!=TK_ID;.  i
a9a0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
a9b0: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66  [i++] = '"';.  f
a9c0: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
a9d0: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
a9e0: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
a9f0: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
aa00: 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d  j]=='"' ) z[i++]
aa10: 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66   = '"';.  }.  if
aa20: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
aa30: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b  i++] = '"';.  z[
aa40: 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20  i] = 0;.  *pIdx 
aa50: 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = i;.}../*.** Ge
aa60: 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20  nerate a CREATE 
aa70: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
aa80: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
aa90: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62  the given.** tab
aaa0: 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68  le.  Memory to h
aab0: 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  old the text of 
aac0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
aad0: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
aae0: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
aaf0: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
ab00: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
ab10: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
ab20: 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61  tatic char *crea
ab30: 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c 69  teTableStmt(sqli
ab40: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
ab50: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20  p){.  int i, k, 
ab60: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  n;.  char *zStmt
ab70: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20  ;.  char *zSep, 
ab80: 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a  *zSep2, *zEnd, *
ab90: 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  z;.  Column *pCo
aba0: 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f  l;.  n = 0;.  fo
abb0: 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c  r(pCol = p->aCol
abc0: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
abd0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
abe0: 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65      n += identLe
abf0: 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ngth(pCol->zName
ac00: 29 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f 6c 2d  );.    z = pCol-
ac10: 3e 7a 54 79 70 65 3b 0a 20 20 20 20 69 66 28 20  >zType;.    if( 
ac20: 7a 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20  z ){.      n += 
ac30: 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  (sqlite3Strlen30
ac40: 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a  (z) + 1);.    }.
ac50: 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74    }.  n += ident
ac60: 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29  Length(p->zName)
ac70: 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 0a  ;.  if( n<50 ){.
ac80: 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20      zSep = "";. 
ac90: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a     zSep2 = ",";.
aca0: 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a      zEnd = ")";.
acb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65    }else{.    zSe
acc0: 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20  p = "\n  ";.    
acd0: 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b  zSep2 = ",\n  ";
ace0: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29  .    zEnd = "\n)
acf0: 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35  ";.  }.  n += 35
ad00: 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20   + 6*p->nCol;.  
ad10: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
ad20: 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 69 66  alloc( n );.  if
ad30: 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  ( zStmt==0 ){.  
ad40: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
ad50: 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ed = 1;.    retu
ad60: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
ad70: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20  te3_snprintf(n, 
ad80: 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54  zStmt, "CREATE T
ad90: 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73  ABLE ");.  k = s
ada0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
adb0: 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75  Stmt);.  identPu
adc0: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e  t(zStmt, &k, p->
add0: 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b  zName);.  zStmt[
ade0: 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f  k++] = '(';.  fo
adf0: 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20  r(pCol=p->aCol, 
ae00: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
ae10: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
ae20: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
ae30: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
ae40: 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20  ], zSep);.    k 
ae50: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
ae60: 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20  30(&zStmt[k]);. 
ae70: 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b     zSep = zSep2;
ae80: 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53  .    identPut(zS
ae90: 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a  tmt, &k, pCol->z
aea0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 28  Name);.    if( (
aeb0: 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29  z = pCol->zType)
aec0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 74  !=0 ){.      zSt
aed0: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20  mt[k++] = ' ';. 
aee0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e       assert( (in
aef0: 74 29 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  t)(sqlite3Strlen
af00: 33 30 28 7a 29 2b 6b 2b 31 29 3c 3d 6e 20 29 3b  30(z)+k+1)<=n );
af10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
af20: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
af30: 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 29  tmt[k], "%s", z)
af40: 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73 71 6c  ;.      k += sql
af50: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b  ite3Strlen30(z);
af60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
af70: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
af80: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25  k, &zStmt[k], "%
af90: 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74  s", zEnd);.  ret
afa0: 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a  urn zStmt;.}../*
afb0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
afc0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
afd0: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
afe0: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
aff0: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
b000: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
b010: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
b020: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
b030: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
b040: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
b050: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
b060: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
b070: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
b080: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
b090: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
b0a0: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
b0b0: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
b0c0: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
b0d0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
b0e0: 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a  n disk, unless.*
b0f0: 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  * this is a temp
b100: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64  orary table or d
b110: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e  b->init.busy==1.
b120: 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e    When db->init.
b130: 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65  busy==1.** it me
b140: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
b150: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
b160: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
b170: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
b180: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
b190: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
b1a0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
b1b0: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
b1c0: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
b1d0: 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  ed, so the entry
b1e0: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
b1f0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
b200: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
b210: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
b220: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
b230: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
b240: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
b250: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
b260: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
b270: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
b280: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
b290: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
b2a0: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
b2b0: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
b2c0: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
b2d0: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
b2e0: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
b2f0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
b300: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
b310: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
b320: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
b330: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
b340: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
b350: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b360: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
b370: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
b380: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20   Token *pCons,  
b390: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b3a0: 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20  ',' token after 
b3b0: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
b3c0: 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  defn. */.  Token
b3d0: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
b3e0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c 20     /* The final 
b3f0: 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ')' token in the
b400: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f   CREATE TABLE */
b410: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
b420: 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ct         /* Se
b430: 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45  lect from a "CRE
b440: 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  ATE ... AS SELEC
b450: 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  T" */.){.  Table
b460: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p;.  sqlite3 *
b470: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b480: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
b490: 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70  f( (pEnd==0 && p
b4a0: 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50  Select==0) || pP
b4b0: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
b4c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b4d0: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   {.    return;. 
b4e0: 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d   }.  p = pParse-
b4f0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
b500: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
b510: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ..  assert( !db-
b520: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70  >init.busy || !p
b530: 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69 44 62  Select );..  iDb
b540: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
b550: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
b560: 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
b570: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
b580: 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ECK.  /* Resolve
b590: 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48   names in all CH
b5a0: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  ECK constraint e
b5b0: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
b5c0: 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b  .  if( p->pCheck
b5d0: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
b5e0: 73 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  sSrc;           
b5f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20          /* Fake 
b600: 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50 61 72  SrcList for pPar
b610: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f  se->pNewTable */
b620: 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
b630: 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20   sNC;           
b640: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e       /* Name con
b650: 74 65 78 74 20 66 6f 72 20 70 50 61 72 73 65 2d  text for pParse-
b660: 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a 20  >pNewTable */.. 
b670: 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
b680: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
b690: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 53 72  .    memset(&sSr
b6a0: 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 72  c, 0, sizeof(sSr
b6b0: 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e 6e 53  c));.    sSrc.nS
b6c0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53 72 63  rc = 1;.    sSrc
b6d0: 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d  .a[0].zName = p-
b6e0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53 72 63  >zName;.    sSrc
b6f0: 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 3b 0a  .a[0].pTab = p;.
b700: 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43      sSrc.a[0].iC
b710: 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 20 20  ursor = -1;.    
b720: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
b730: 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
b740: 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20  cList = &sSrc;. 
b750: 20 20 20 73 4e 43 2e 69 73 43 68 65 63 6b 20 3d     sNC.isCheck =
b760: 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   1;.    if( sqli
b770: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
b780: 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 43 68  mes(&sNC, p->pCh
b790: 65 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 65  eck) ){.      re
b7a0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
b7b0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
b7c0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
b7d0: 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49  HECK) */..  /* I
b7e0: 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
b7f0: 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
b800: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
b810: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
b820: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
b830: 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
b840: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
b850: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
b860: 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
b870: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
b880: 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
b890: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
b8a0: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
b8b0: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
b8c0: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
b8d0: 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
b8e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
b8f0: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
b900: 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
b910: 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
b920: 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a   routine.).  */.
b930: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
b940: 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e  usy ){.    p->tn
b950: 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
b960: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
b970: 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   If not initiali
b980: 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74  zing, then creat
b990: 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74  e a record for t
b9a0: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a  he new table.  *
b9b0: 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  * in the SQLITE_
b9c0: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20  MASTER table of 
b9d0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
b9e0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
b9f0: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65  .  ** for the ne
ba00: 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68  w table entry sh
ba10: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
ba20: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  on the stack..  
ba30: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
ba40: 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74  is a TEMPORARY t
ba50: 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20  able, write the 
ba60: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61  entry into the a
ba70: 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69  uxiliary.  ** fi
ba80: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
ba90: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
baa0: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
bab0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
bac0: 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  busy ){.    int 
bad0: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
bae0: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
baf0: 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72      /* "view" or
bb00: 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20   "table" */.    
bb10: 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20  char *zType2;   
bb20: 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41  /* "VIEW" or "TA
bb30: 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  BLE" */.    char
bb40: 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54   *zStmt;    /* T
bb50: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
bb60: 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54  E TABLE or CREAT
bb70: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
bb80: 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c   */..    v = sql
bb90: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
bba0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
bbb0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  0 ) return;..   
bbc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bbd0: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
bbe0: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  0);..    /* Crea
bbf0: 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  te the rootpage 
bc00: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
bc10: 65 20 61 6e 64 20 70 75 73 68 20 69 74 20 6f 6e  e and push it on
bc20: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  to the stack..  
bc30: 20 20 2a 2a 20 41 20 76 69 65 77 20 68 61 73 20    ** A view has 
bc40: 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20  no rootpage, so 
bc50: 6a 75 73 74 20 70 75 73 68 20 61 20 7a 65 72 6f  just push a zero
bc60: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20   onto the stack 
bc70: 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65 77 73  for.    ** views
bc80: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54  .  Initialize zT
bc90: 79 70 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ype at the same 
bca0: 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  time..    */.   
bcb0: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
bcc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
bcd0: 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a   regular table *
bce0: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
bcf0: 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a  "table";.      z
bd00: 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b  Type2 = "TABLE";
bd10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bd20: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65  OMIT_VIEW.    }e
bd30: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
bd40: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54  view */.      zT
bd50: 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20  ype = "view";.  
bd60: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49      zType2 = "VI
bd70: 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EW";.#endif.    
bd80: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
bd90: 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41  s is a CREATE TA
bda0: 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54  BLE xx AS SELECT
bdb0: 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68   ..., execute th
bdc0: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  e SELECT.    ** 
bdd0: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70  statement to pop
bde0: 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61  ulate the new ta
bdf0: 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61  ble. The root-pa
be00: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
be10: 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62  e.    ** new tab
be20: 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70  le is on the top
be30: 20 6f 66 20 74 68 65 20 76 64 62 65 20 73 74 61   of the vdbe sta
be40: 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ck..    **.    *
be50: 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43  * Once the SELEC
be60: 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
be70: 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
be80: 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a  t(), it is in a.
be90: 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20      ** suitable 
bea0: 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66  state to query f
beb0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
bec0: 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f  mes and types to
bed0: 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   be used.    ** 
bee0: 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  by the new table
bef0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
bf00: 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77  A shared-cache w
bf10: 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74  rite-lock is not
bf20: 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69   required to wri
bf30: 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61  te to the new ta
bf40: 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61  ble,.    ** as a
bf50: 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73   schema-lock mus
bf60: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
bf70: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20  een obtained to 
bf80: 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65  create it. Since
bf90: 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61  .    ** a schema
bfa0: 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61  -lock excludes a
bfb0: 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ll other databas
bfc0: 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69  e users, the wri
bfd0: 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20  te-lock would.  
bfe0: 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e    ** be redundan
bff0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
c000: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
c010: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
c020: 73 74 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  st;.      Table 
c030: 2a 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20 20 20  *pSelTab;..     
c040: 20 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e   assert(pParse->
c050: 6e 54 61 62 3d 3d 30 29 3b 0a 20 20 20 20 20 20  nTab==0);.      
c060: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c070: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  3(v, OP_OpenWrit
c080: 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65  e, 1, pParse->re
c090: 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20  gRoot, iDb);.   
c0a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
c0b0: 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20  angeP5(v, 1);.  
c0c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
c0d0: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
c0e0: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
c0f0: 74 28 26 64 65 73 74 2c 20 53 52 54 5f 54 61 62  t(&dest, SRT_Tab
c100: 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  le, 1);.      sq
c110: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
c120: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65  se, pSelect, &de
c130: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
c140: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
c150: 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20  OP_Close, 1);.  
c160: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
c170: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nErr==0 ){.     
c180: 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
c190: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
c1a0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
c1b0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
c1c0: 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
c1d0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
c1e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
c1f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
c200: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
c210: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->nCol;.        
c220: 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->aCol = pSelTa
c230: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->aCol;.       
c240: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
c250: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   0;.        pSel
c260: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
c270: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
c280: 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c 54 61  leteTable(pSelTa
c290: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
c2a0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  }..    /* Comput
c2b0: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  e the complete t
c2c0: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
c2d0: 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
c2e0: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
c2f0: 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  {.      zStmt = 
c300: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
c310: 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73  db, p);.    }els
c320: 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e  e{.      n = (in
c330: 74 29 28 70 45 6e 64 2d 3e 7a 20 2d 20 70 50 61  t)(pEnd->z - pPa
c340: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
c350: 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53  z) + 1;.      zS
c360: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
c370: 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20  intf(db, .      
c380: 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25      "CREATE %s %
c390: 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c  .*s", zType2, n,
c3a0: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
c3b0: 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20  ken.z.      );. 
c3c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73     }..    /* A s
c3d0: 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f  lot for the reco
c3e0: 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  rd has already b
c3f0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  een allocated in
c400: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c   the .    ** SQL
c410: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
c420: 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20  .  We just need 
c430: 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73  to update that s
c440: 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20  lot with all.   
c450: 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   ** the informat
c460: 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63  ion we've collec
c470: 74 65 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  ted.  The rowid 
c480: 66 6f 72 20 74 68 65 20 70 72 65 61 6c 6c 6f 63  for the prealloc
c490: 61 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f 74  ated.    ** slot
c4a0: 20 69 73 20 74 68 65 20 32 6e 64 20 69 74 65 6d   is the 2nd item
c4b0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
c4c0: 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  The top of the s
c4d0: 74 61 63 6b 20 69 73 20 74 68 65 0a 20 20 20 20  tack is the.    
c4e0: 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72  ** root page for
c4f0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28   the new table (
c500: 6f 72 20 61 20 30 20 69 66 20 74 68 69 73 20 69  or a 0 if this i
c510: 73 20 61 20 76 69 65 77 29 2e 0a 20 20 20 20 2a  s a view)..    *
c520: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
c530: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
c540: 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25  .      "UPDATE %
c550: 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20  Q.%s ".         
c560: 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20  "SET type='%s', 
c570: 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d  name=%Q, tbl_nam
c580: 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23  e=%Q, rootpage=#
c590: 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  %d, sql=%Q ".   
c5a0: 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
c5b0: 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d  =#%d",.      db-
c5c0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
c5d0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
c5e0: 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c  b),.      zType,
c5f0: 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
c600: 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
c610: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
c620: 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53  egRoot,.      zS
c630: 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73  tmt,.      pPars
c640: 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20  e->regRowid.    
c650: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
c660: 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
c670: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
c680: 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
c690: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
c6a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
c6b0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a  INCREMENT.    /*
c6c0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
c6d0: 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
c6e0: 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71  te an sqlite_seq
c6f0: 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a  uence table for.
c700: 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74      ** keeping t
c710: 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72  rack of autoincr
c720: 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20  ement keys..    
c730: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 61  */.    if( p->ta
c740: 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
c750: 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
c760: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
c770: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
c780: 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
c790: 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29  ma->pSeqTab==0 )
c7a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c7b0: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
c7c0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
c7d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e  CREATE TABLE %Q.
c7e0: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28  sqlite_sequence(
c7f0: 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20  name,seq)",.    
c800: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
c810: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
c820: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
c830: 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65  ..    /* Reparse
c840: 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75   everything to u
c850: 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e  pdate our intern
c860: 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72  al data structur
c870: 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  es */.    sqlite
c880: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
c890: 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69  P_ParseSchema, i
c8a0: 44 62 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  Db, 0, 0,.      
c8b0: 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
c8c0: 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27  (db, "tbl_name='
c8d0: 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20  %q'",p->zName), 
c8e0: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
c8f0: 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  ...  /* Add the 
c900: 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d  table to the in-
c910: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
c920: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
c930: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
c940: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
c950: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
c960: 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
c970: 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20  *pOld;.    FKey 
c980: 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 53 63 68  *pFKey; .    Sch
c990: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70  ema *pSchema = p
c9a0: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
c9b0: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
c9c0: 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61  hInsert(&pSchema
c9d0: 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->tblHash, p->zN
c9e0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca00: 20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33    sqlite3Strlen3
ca10: 30 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 70 29  0(p->zName)+1,p)
ca20: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29  ;.    if( pOld )
ca30: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
ca40: 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d  p==pOld );  /* M
ca50: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
ca60: 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61  failed inside Ha
ca70: 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20  shInsert() */.  
ca80: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
ca90: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
caa0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 69  return;.    }.#i
cab0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cac0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
cad0: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70    for(pFKey=p->p
cae0: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
caf0: 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  ey=pFKey->pNextF
cb00: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  rom){.      void
cb10: 20 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 69 6e   *data;.      in
cb20: 74 20 6e 54 6f 20 3d 20 73 71 6c 69 74 65 33 53  t nTo = sqlite3S
cb30: 74 72 6c 65 6e 33 30 28 70 46 4b 65 79 2d 3e 7a  trlen30(pFKey->z
cb40: 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  To) + 1;.      p
cb50: 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
cb60: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
cb70: 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c  &pSchema->aFKey,
cb80: 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f   pFKey->zTo, nTo
cb90: 29 3b 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20  );.      data = 
cba0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
cbb0: 74 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65  t(&pSchema->aFKe
cbc0: 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e  y, pFKey->zTo, n
cbd0: 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20  To, pFKey);.    
cbe0: 20 20 69 66 28 20 64 61 74 61 3d 3d 28 76 6f 69    if( data==(voi
cbf0: 64 20 2a 29 70 46 4b 65 79 20 29 7b 0a 20 20 20  d *)pFKey ){.   
cc00: 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
cc10: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
cc20: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
cc30: 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
cc40: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  Table = 0;.    d
cc50: 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20  b->nTable++;.   
cc60: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
cc70: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
cc80: 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
cc90: 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
cca0: 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  BLE.    if( !p->
ccb0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
ccc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
ccd0: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
cce0: 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   *)pParse->sName
ccf0: 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69  Token.z;.      i
cd00: 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20  nt nName;.      
cd10: 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74  assert( !pSelect
cd20: 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e   && pCons && pEn
cd30: 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
cd40: 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  Cons->z==0 ){.  
cd50: 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45        pCons = pE
cd60: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
cd70: 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28    nName = (int)(
cd80: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43  (const char *)pC
cd90: 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b  ons->z - zName);
cda0: 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c  .      p->addCol
cdb0: 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71  Offset = 13 + sq
cdc0: 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e  lite3Utf8CharLen
cdd0: 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a  (zName, nName);.
cde0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
cdf0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
ce00: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
ce10: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
ce20: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
ce30: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
ce40: 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
ce50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
ce60: 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
ce70: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
ce80: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
ce90: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
cea0: 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
ceb0: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
cec0: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
ced0: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
cee0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
cef0: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
cf00: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
cf10: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
cf20: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
cf30: 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me2,     /* The 
cf40: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
cf50: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
cf60: 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63   view */.  Selec
cf70: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a  t *pSelect,   /*
cf80: 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   A SELECT statem
cf90: 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ent that will be
cfa0: 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65  come the new vie
cfb0: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
cfc0: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  p,        /* TRU
cfd0: 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52  E for a TEMPORAR
cfe0: 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  Y view */.  int 
cff0: 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20 2f  noErr          /
d000: 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f 72  * Suppress error
d010: 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49 45   messages if VIE
d020: 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  W already exists
d030: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
d040: 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f  p;.  int n;.  co
d050: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
d060: 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45  r *z;.  Token sE
d070: 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46  nd;.  DbFixer sF
d080: 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61  ix;.  Token *pNa
d090: 6d 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20  me;.  int iDb;. 
d0a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
d0b0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
d0c0: 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30  ( pParse->nVar>0
d0d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
d0e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
d0f0: 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20  "parameters are 
d100: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76  not allowed in v
d110: 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69  iews");.    sqli
d120: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
d130: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
d140: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
d150: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
d160: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
d170: 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70  , pName2, isTemp
d180: 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a  , 1, 0, noErr);.
d190: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
d1a0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
d1b0: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
d1c0: 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
d1d0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
d1e0: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b, pSelect);.   
d1f0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
d200: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
d210: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
d220: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
d230: 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  );.  iDb = sqlit
d240: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
d250: 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
d260: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
d270: 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
d280: 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22  rse, iDb, "view"
d290: 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20  , pName).    && 
d2a0: 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74  sqlite3FixSelect
d2b0: 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29  (&sFix, pSelect)
d2c0: 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
d2d0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
d2e0: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
d2f0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
d300: 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
d310: 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45   the entire SELE
d320: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
d330: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
d340: 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69  ew..  ** This wi
d350: 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65  ll force all the
d360: 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61   Expr.token.z va
d370: 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d  lues to be dynam
d380: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  ically.  ** allo
d390: 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61  cated rather tha
d3a0: 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69  n point to the i
d3b0: 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68  nput string - wh
d3c0: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  ich means that. 
d3d0: 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65   ** they will pe
d3e0: 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20  rsist after the 
d3f0: 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f  current sqlite3_
d400: 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75  exec() call retu
d410: 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  rns..  */.  p->p
d420: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
d430: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53  SelectDup(db, pS
d440: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
d450: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
d460: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  , pSelect);.  if
d470: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
d480: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
d490: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 2d  ;.  }.  if( !db-
d4a0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
d4b0: 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74    sqlite3ViewGet
d4c0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
d4d0: 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  se, p);.  }..  /
d4e0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64  * Locate the end
d4f0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56   of the CREATE V
d500: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  IEW statement.  
d510: 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20  Make sEnd point 
d520: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e  to.  ** the end.
d530: 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70  .  */.  sEnd = p
d540: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
d550: 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b  n;.  if( sEnd.z[
d560: 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b  0]!=0 && sEnd.z[
d570: 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
d580: 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
d590: 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
d5a0: 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73  0;.  n = (int)(s
d5b0: 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e  End.z - pBegin->
d5c0: 7a 29 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74  z);.  z = (const
d5d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29   unsigned char*)
d5e0: 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69  pBegin->z;.  whi
d5f0: 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d  le( n>0 && (z[n-
d600: 31 5d 3d 3d 27 3b 27 20 7c 7c 20 73 71 6c 69 74  1]==';' || sqlit
d610: 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d  e3Isspace(z[n-1]
d620: 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73  )) ){ n--; }.  s
d630: 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b  End.z = &z[n-1];
d640: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a  .  sEnd.n = 1;..
d650: 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33    /* Use sqlite3
d660: 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64  EndTable() to ad
d670: 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68  d the view to th
d680: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
d690: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
d6a0: 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73  e3EndTable(pPars
d6b0: 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b  e, 0, &sEnd, 0);
d6c0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e  .  return;.}.#en
d6d0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
d6e0: 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20  IT_VIEW */..#if 
d6f0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d700: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
d710: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
d720: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
d730: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  ./*.** The Table
d740: 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c   structure pTabl
d750: 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49  e is really a VI
d760: 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  EW.  Fill in the
d770: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
d780: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
d790: 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62  view in the pTab
d7a0: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  le structure.  R
d7b0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
d7c0: 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  .** of errors.  
d7d0: 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73  If an error is s
d7e0: 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72  een leave an err
d7f0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
d800: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
d810: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65  /.int sqlite3Vie
d820: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
d830: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
d840: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
d850: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
d860: 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62     /* A fake tab
d870: 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65  le from which we
d880: 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   get the result 
d890: 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  set */.  Select 
d8a0: 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f  *pSel;     /* Co
d8b0: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
d8c0: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
d8d0: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69   the view */.  i
d8e0: 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20  nt nErr = 0;    
d8f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
d900: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
d910: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
d920: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
d930: 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65  rarily holds the
d940: 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
d950: 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20  rs assigned */. 
d960: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
d970: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
d980: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
d990: 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72  on for malloc er
d9a0: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  rors */.  int (*
d9b0: 78 41 75 74 68 29 28 76 6f 69 64 2a 2c 69 6e 74  xAuth)(void*,int
d9c0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e  ,const char*,con
d9d0: 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63  st char*,const c
d9e0: 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  har*,const char*
d9f0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  );..  assert( pT
da00: 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66  able );..#ifndef
da10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
da20: 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
da30: 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43  sqlite3VtabCallC
da40: 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70  onnect(pParse, p
da50: 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65  Table) ){.    re
da60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
da70: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56  R;.  }.  if( IsV
da80: 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29  irtual(pTable) )
da90: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
daa0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
dab0: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
dac0: 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c   A positive nCol
dad0: 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d   means the colum
dae0: 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  ns names for thi
daf0: 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20  s view are.  ** 
db00: 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20  already known.. 
db10: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
db20: 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72  ->nCol>0 ) retur
db30: 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67  n 0;..  /* A neg
db40: 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20  ative nCol is a 
db50: 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d  special marker m
db60: 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61  eaning that we a
db70: 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a  re currently.  *
db80: 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70  * trying to comp
db90: 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
dba0: 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74  ames.  If we ent
dbb0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
dbc0: 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61  with.  ** a nega
dbd0: 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65  tive nCol, it me
dbe0: 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ans two or more 
dbf0: 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f  views form a loo
dc00: 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  p, like this:.  
dc10: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  **.  **     CREA
dc20: 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53  TE VIEW one AS S
dc30: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f  ELECT * FROM two
dc40: 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
dc50: 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45  E VIEW two AS SE
dc60: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b  LECT * FROM one;
dc70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
dc80: 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20  lly, this error 
dc90: 69 73 20 63 61 75 67 68 74 20 70 72 65 76 69 6f  is caught previo
dca0: 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20  usly and so the 
dcb0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20  following test. 
dcc0: 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79   ** should alway
dcd0: 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20  s fail.  But we 
dce0: 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e  will leave it in
dcf0: 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62   place just to b
dd00: 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69  e safe..  */.  i
dd10: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c  f( pTable->nCol<
dd20: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
dd30: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
dd40: 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72   "view %s is cir
dd50: 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22  cularly defined"
dd60: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
dd70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
dd80: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54    }.  assert( pT
dd90: 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b  able->nCol>=0 );
dda0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
ddb0: 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
ddc0: 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63  ans we need to c
ddd0: 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65  ompute the table
dde0: 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74   names..  ** Not
ddf0: 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20  e that the call 
de00: 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  to sqlite3Result
de10: 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69  SetOfSelect() wi
de20: 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20  ll expand any.  
de30: 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20  ** "*" elements 
de40: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73  in the results s
de50: 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61  et of the view a
de60: 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63  nd will assign c
de70: 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74  ursors.  ** to t
de80: 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  he elements of t
de90: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
dea0: 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77   But we do not w
deb0: 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65  ant these change
dec0: 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72  s.  ** to be per
ded0: 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20  manent.  So the 
dee0: 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64  computation is d
def0: 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66  one on a copy of
df00: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a   the SELECT.  **
df10: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
df20: 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
df30: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
df40: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
df50: 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c   );.  pSel = sql
df60: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
df70: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
df80: 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29  t);.  if( pSel )
df90: 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65  {.    n = pParse
dfa0: 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69  ->nTab;.    sqli
dfb0: 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
dfc0: 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
dfd0: 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20  pSel->pSrc);.   
dfe0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
dff0: 2d 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  -1;.#ifndef SQLI
e000: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
e010: 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20  ATION.    xAuth 
e020: 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20  = db->xAuth;.   
e030: 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a   db->xAuth = 0;.
e040: 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
e050: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
e060: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
e070: 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41  Sel);.    db->xA
e080: 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c  uth = xAuth;.#el
e090: 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d  se.    pSelTab =
e0a0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
e0b0: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
e0c0: 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a  , pSel);.#endif.
e0d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
e0e0: 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 53   = n;.    if( pS
e0f0: 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 61  elTab ){.      a
e100: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61  ssert( pTable->a
e110: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
e120: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70  pTable->nCol = p
e130: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
e140: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
e150: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
e160: 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
e170: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
e180: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
e190: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
e1a0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 65  3DeleteTable(pSe
e1b0: 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61  lTab);.      pTa
e1c0: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6c  ble->pSchema->fl
e1d0: 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65  ags |= DB_Unrese
e1e0: 74 56 69 65 77 73 3b 0a 20 20 20 20 7d 65 6c 73  tViews;.    }els
e1f0: 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  e{.      pTable-
e200: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
e210: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20   nErr++;.    }. 
e220: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
e230: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29  Delete(db, pSel)
e240: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
e250: 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e   nErr++;.  }.#en
e260: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
e270: 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74  IT_VIEW */.  ret
e280: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65  urn nErr;  .}.#e
e290: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
e2a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
e2b0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
e2c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
e2d0: 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66  ALTABLE) */..#if
e2e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e2f0: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  _VIEW./*.** Clea
e300: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
e310: 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49  es from every VI
e320: 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  EW in database i
e330: 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  dx..*/.static vo
e340: 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  id sqliteViewRes
e350: 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  etAll(sqlite3 *d
e360: 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48  b, int idx){.  H
e370: 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66  ashElem *i;.  if
e380: 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  ( !DbHasProperty
e390: 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
e3a0: 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74  esetViews) ) ret
e3b0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  urn;.  for(i=sql
e3c0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
e3d0: 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65  ->aDb[idx].pSche
e3e0: 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b  ma->tblHash); i;
e3f0: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
e400: 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  (i)){.    Table 
e410: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
e420: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
e430: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
e440: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e450: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
e460: 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTab);.    }.  
e470: 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65  }.  DbClearPrope
e480: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
e490: 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d  UnresetViews);.}
e4a0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
e4b0: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
e4c0: 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f  ll(A,B).#endif /
e4d0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
e4e0: 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  EW */../*.** Thi
e4f0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
e500: 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45  lled by the VDBE
e510: 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69   to adjust the i
e520: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
e530: 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65  * used by SQLite
e540: 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20   when the btree 
e550: 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61  layer moves a ta
e560: 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54  ble root page. T
e570: 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20  he.** root-page 
e580: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
e590: 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20  dex in database 
e5a0: 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20  iDb has changed 
e5b0: 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f  from iFrom.** to
e5c0: 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b   iTo..**.** Tick
e5d0: 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73  et #1728:  The s
e5e0: 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68  ymbol table migh
e5f0: 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  t still contain 
e600: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f  information.** o
e610: 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20  n tables and/or 
e620: 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65  indices that are
e630: 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
e640: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a  being deleted..*
e650: 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c  * If you are unl
e660: 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f  ucky, one of tho
e670: 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  se deleted indic
e680: 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67  es or tables mig
e690: 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73  ht.** have the s
e6a0: 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d  ame rootpage num
e6b0: 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20  ber as the real 
e6c0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
e6d0: 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20  hat is.** being 
e6e0: 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61  moved.  So we ca
e6f0: 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68  nnot stop search
e700: 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69  ing after the fi
e710: 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65  rst match .** be
e720: 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20  cause the first 
e730: 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66  match might be f
e740: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65  or one of the de
e750: 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a  leted indices.**
e760: 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e   or tables and n
e770: 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64  ot the table/ind
e780: 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61  ex that is actua
e790: 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e  lly being moved.
e7a0: 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74  .** We must cont
e7b0: 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74  inue looping unt
e7c0: 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e  il all tables an
e7d0: 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a  d indices with.*
e7e0: 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f  * rootpage==iFro
e7f0: 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76  m have been conv
e800: 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20  erted to have a 
e810: 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a  rootpage of iTo.
e820: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ** in order to b
e830: 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77  e certain that w
e840: 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20  e got the right 
e850: 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  one..*/.#ifndef 
e860: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
e870: 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69  VACUUM.void sqli
e880: 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64  te3RootPageMoved
e890: 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46  (Db *pDb, int iF
e8a0: 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
e8b0: 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d   HashElem *pElem
e8c0: 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b  ;.  Hash *pHash;
e8d0: 0a 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  ..  pHash = &pDb
e8e0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
e8f0: 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
e900: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
e910: 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
e920: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
e930: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
e940: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
e950: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
e960: 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54  lem);.    if( pT
e970: 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  ab->tnum==iFrom 
e980: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  ){.      pTab->t
e990: 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
e9a0: 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26  .  }.  pHash = &
e9b0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  pDb->pSchema->id
e9c0: 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  xHash;.  for(pEl
e9d0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
e9e0: 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
e9f0: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
ea00: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
ea10: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
ea20: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
ea30: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
ea40: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pIdx->tnum==iFr
ea50: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  om ){.      pIdx
ea60: 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
ea70: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
ea80: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f  ../*.** Write co
ea90: 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20  de to erase the 
eaa0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
eab0: 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d  page iTable from
eac0: 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a   database iDb..*
ead0: 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64  * Also write cod
eae0: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
eaf0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
eb00: 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  ble and internal
eb10: 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20   schema.** if a 
eb20: 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f  root-page of ano
eb30: 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
eb40: 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
eb50: 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a  -layer whilst.**
eb60: 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20   erasing iTable 
eb70: 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
eb80: 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
eb90: 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
eba0: 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
ebb0: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
ebc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
ebd0: 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69  nt iTable, int i
ebe0: 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
ebf0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
ec00: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
ec10: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
ec20: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
ec30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ec40: 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  p3(v, OP_Destroy
ec50: 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44  , iTable, r1, iD
ec60: 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  b);.#ifndef SQLI
ec70: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
ec80: 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72  UM.  /* OP_Destr
ec90: 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20  oy stores an in 
eca0: 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20 74  integer r1. If t
ecb0: 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a  his integer.  **
ecc0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
ecd0: 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f  en it is the roo
ece0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
ecf0: 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74   a table moved t
ed00: 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20  o.  ** location 
ed10: 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  iTable. The foll
ed20: 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66  owing code modif
ed30: 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ies the sqlite_m
ed40: 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20  aster table to. 
ed50: 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73   ** reflect this
ed60: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
ed70: 22 23 25 64 22 20 69 6e 20 74 68 65 20 53 51 4c  "#%d" in the SQL
ed80: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f   is a special co
ed90: 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e  nstant that mean
eda0: 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65  s whatever value
edb0: 0a 20 20 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20  .  ** is on the 
edc0: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
edd0: 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 52 65  .  See sqlite3Re
ede0: 67 69 73 74 65 72 45 78 70 72 28 29 2e 0a 20 20  gisterExpr()..  
edf0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74  */.  sqlite3Nest
ee00: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
ee10: 0a 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51  .     "UPDATE %Q
ee20: 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65  .%s SET rootpage
ee30: 3d 25 64 20 57 48 45 52 45 20 23 25 64 20 41 4e  =%d WHERE #%d AN
ee40: 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c  D rootpage=#%d",
ee50: 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62  .     pParse->db
ee60: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
ee70: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
ee80: 44 62 29 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c  Db), iTable, r1,
ee90: 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73   r1);.#endif.  s
eea0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
eeb0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
eec0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
eed0: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72   VDBE code to er
eee0: 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61  ase table pTab a
eef0: 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65  nd all associate
ef00: 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73  d indices on dis
ef10: 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70  k..** Code to up
ef20: 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f  date the sqlite_
ef30: 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e  master tables an
ef40: 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  d internal schem
ef50: 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  a definitions.**
ef60: 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d   in case a root-
ef70: 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
ef80: 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  o another table 
ef90: 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
efa0: 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69  btree layer.** i
efb0: 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68  s also added (th
efc0: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
efd0: 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
efe0: 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a  m database)..*/.
eff0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
f000: 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a  royTable(Parse *
f010: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
f020: 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  Tab){.#ifdef SQL
f030: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
f040: 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  UUM.  Index *pId
f050: 78 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73  x;.  int iDb = s
f060: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
f070: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
f080: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
f090: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
f0a0: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  e(pParse, pTab->
f0b0: 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f  tnum, iDb);.  fo
f0c0: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
f0d0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
f0e0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
f0f0: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
f100: 65 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  e(pParse, pIdx->
f110: 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  tnum, iDb);.  }.
f120: 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68  #else.  /* If th
f130: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62  e database may b
f140: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61  e auto-vacuum ca
f150: 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45  pable (if SQLITE
f160: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
f170: 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66  .  ** is not def
f180: 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69  ined), then it i
f190: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63  s important to c
f1a0: 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f  all OP_Destroy o
f1b0: 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65  n the.  ** table
f1c0: 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d   and index root-
f1d0: 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20  pages in order, 
f1e0: 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68  starting with th
f1f0: 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20  e numerically . 
f200: 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74   ** largest root
f210: 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68  -page number. Th
f220: 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  is guarantees th
f230: 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72  at none of the r
f240: 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74  oot-pages.  ** t
f250: 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69  o be destroyed i
f260: 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61  s relocated by a
f270: 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73  n earlier OP_Des
f280: 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68  troy. i.e. if th
f290: 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  e.  ** following
f2a0: 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a   were coded:.  *
f2b0: 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f  *.  ** OP_Destro
f2c0: 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20  y 4 0.  ** .... 
f2d0: 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35   ** OP_Destroy 5
f2e0: 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64   0.  **.  ** and
f2f0: 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70   root page 5 hap
f300: 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20  pened to be the 
f310: 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
f320: 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a  e number in the.
f330: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74    ** database, t
f340: 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20  hen root page 5 
f350: 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74  would be moved t
f360: 6f 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20  o page 4 by the 
f370: 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f  .  ** "OP_Destro
f380: 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54  y 4 0" opcode. T
f390: 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f  he subsequent "O
f3a0: 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77  P_Destroy 5 0" w
f3b0: 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20  ould hit.  ** a 
f3c0: 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a  free-list page..
f3d0: 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20    */.  int iTab 
f3e0: 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20  = pTab->tnum;.  
f3f0: 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d  int iDestroyed =
f400: 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20   0;..  while( 1 
f410: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
f420: 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72  dx;.    int iLar
f430: 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  gest = 0;..    i
f440: 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30  f( iDestroyed==0
f450: 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f   || iTab<iDestro
f460: 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61  yed ){.      iLa
f470: 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20  rgest = iTab;.  
f480: 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78    }.    for(pIdx
f490: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
f4a0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
f4b0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
f4c0: 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74  t iIdx = pIdx->t
f4d0: 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  num;.      asser
f4e0: 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61  t( pIdx->pSchema
f4f0: 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
f500: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44  );.      if( (iD
f510: 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28  estroyed==0 || (
f520: 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29  iIdx<iDestroyed)
f530: 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65  ) && iIdx>iLarge
f540: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c  st ){.        iL
f550: 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20  argest = iIdx;. 
f560: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f570: 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30   if( iLargest==0
f580: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
f590: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f5a0: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
f5b0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
f5c0: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
f5d0: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
f5e0: 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
f5f0: 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72  age(pParse, iLar
f600: 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  gest, iDb);.    
f610: 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69    iDestroyed = i
f620: 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20  Largest;.    }. 
f630: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
f640: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f650: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
f660: 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
f670: 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
f680: 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
f690: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
f6a0: 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
f6b0: 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
f6c0: 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
f6d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
f6e0: 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
f6f0: 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45   isView, int noE
f700: 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  rr){.  Table *pT
f710: 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ab;.  Vdbe *v;. 
f720: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
f730: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
f740: 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61   iDb;..  if( pPa
f750: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
f760: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
f770: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
f780: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
f790: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
f7a0: 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61  nSrc==1 );.  pTa
f7b0: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
f7c0: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  eTable(pParse, i
f7d0: 73 56 69 65 77 2c 20 0a 20 20 20 20 20 20 20 20  sView, .        
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7f0: 20 20 20 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e      pName->a[0].
f800: 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
f810: 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a  0].zDatabase);..
f820: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
f830: 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29  .    if( noErr )
f840: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
f850: 72 72 6f 72 43 6c 65 61 72 28 70 50 61 72 73 65  rrorClear(pParse
f860: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  );.    }.    got
f870: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
f880: 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  e;.  }.  iDb = s
f890: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
f8a0: 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
f8b0: 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74  chema);.  assert
f8c0: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
f8d0: 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a  db->nDb );..  /*
f8e0: 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69   If pTab is a vi
f8f0: 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c  rtual table, cal
f900: 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  l ViewGetColumnN
f910: 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65  ames() to ensure
f920: 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74  .  ** it is init
f930: 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
f940: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
f950: 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69  ab) && sqlite3Vi
f960: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
f970: 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
f980: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
f990: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
f9a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f9b0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
f9c0: 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
f9d0: 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  de;.    const ch
f9e0: 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
f9f0: 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
fa00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
fa10: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
fa20: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  .zName;.    cons
fa30: 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20  t char *zArg2 = 
fa40: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
fa50: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
fa60: 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
fa70: 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
fa80: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
fa90: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
faa0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
fab0: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
fac0: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
fad0: 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
fae0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
faf0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b  _DROP_TEMP_VIEW;
fb00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fb10: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
fb20: 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20  ITE_DROP_VIEW;. 
fb30: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
fb40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
fb50: 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73  ALTABLE.    }els
fb60: 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
fb70: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63  pTab) ){.      c
fb80: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
fb90: 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  P_VTABLE;.      
fba0: 7a 41 72 67 32 20 3d 20 70 54 61 62 2d 3e 70 4d  zArg2 = pTab->pM
fbb0: 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69  od->zName;.#endi
fbc0: 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
fbd0: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
fbe0: 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
fbf0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
fc00: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
fc10: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65  _TABLE;.      }e
fc20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
fc30: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
fc40: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
fc50: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
fc60: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
fc70: 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62  arse, code, pTab
fc80: 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20  ->zName, zArg2, 
fc90: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
fca0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
fcb0: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
fcc0: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
fcd0: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
fce0: 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e  E_DELETE, pTab->
fcf0: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
fd00: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
fd10: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
fd20: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
fd30: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
fd40: 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
fd50: 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d  , "sqlite_", 7)=
fd60: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
fd70: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
fd80: 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
fd90: 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
fda0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
fdb0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
fdc0: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  p_table;.  }..#i
fdd0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fde0: 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75  T_VIEW.  /* Ensu
fdf0: 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73  re DROP TABLE is
fe00: 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76   not used on a v
fe10: 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49  iew, and DROP VI
fe20: 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  EW is not used. 
fe30: 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a   ** on a table..
fe40: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
fe50: 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
fe60: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
fe70: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
fe80: 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
fe90: 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
fea0: 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
feb0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
fec0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
fed0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
fee0: 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
fef0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
ff00: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ff10: 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
ff20: 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
ff30: 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
ff40: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
ff50: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
ff60: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
ff70: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
ff80: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
ff90: 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
ffa0: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
ffb0: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
ffc0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
ffd0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
ffe0: 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20   ){.    Trigger 
fff0: 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 44  *pTrigger;.    D
10000 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
10010 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69  b[iDb];.    sqli
10020 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
10030 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
10040 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
10050 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
10060 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
10070 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
10080 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 76  ) ){.      if( v
10090 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
100a0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
100b0 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20   OP_VBegin);.   
100c0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
100d0 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61  f..    /* Drop a
100e0 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f  ll triggers asso
100f0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
10100 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
10110 70 65 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a  ped. Code.    **
10120 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f   is generated to
10130 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   remove entries 
10140 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74  from sqlite_mast
10150 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a  er and/or.    **
10160 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
10170 74 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e  ter if required.
10180 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69  .    */.    pTri
10190 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72  gger = pTab->pTr
101a0 69 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65  igger;.    while
101b0 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  ( pTrigger ){.  
101c0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
101d0 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  gger->pSchema==p
101e0 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20  Tab->pSchema || 
101f0 0a 20 20 20 20 20 20 20 20 20 20 70 54 72 69 67  .          pTrig
10200 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62  ger->pSchema==db
10210 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
10220 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
10230 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28  3DropTriggerPtr(
10240 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
10250 29 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65  );.      pTrigge
10260 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e  r = pTrigger->pN
10270 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  ext;.    }..#ifn
10280 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10290 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
102a0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20    /* Remove any 
102b0 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73  entries of the s
102c0 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
102d0 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
102e0 77 69 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20  with.    ** the 
102f0 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
10300 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ped. This is don
10310 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62  e before the tab
10320 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20  le is dropped.  
10330 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65    ** at the btre
10340 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65  e level, in case
10350 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
10360 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73  ence table needs
10370 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20   to.    ** move 
10380 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
10390 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70  he drop (can hap
103a0 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  pen in auto-vacu
103b0 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f  um mode)..    */
103c0 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74  .    if( pTab->t
103d0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
103e0 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20  oincrement ){.  
103f0 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
10400 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
10410 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
10420 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73 65  ROM %s.sqlite_se
10430 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d  quence WHERE nam
10440 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 70  e=%Q",.        p
10450 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  Db->zName, pTab-
10460 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
10470 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
10480 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51    /* Drop all SQ
10490 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
104a0 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  e and index entr
104b0 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ies that refer t
104c0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62  o the.    ** tab
104d0 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20  le. The program 
104e0 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75  name loops throu
104f0 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  gh the master ta
10500 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a  ble and deletes.
10510 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77      ** every row
10520 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
10530 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
10540 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
10550 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a  one being.    **
10560 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65   dropped. Trigge
10570 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  rs are handled s
10580 65 70 65 72 61 74 65 6c 79 20 62 65 63 61 75 73  eperately becaus
10590 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20  e a trigger can 
105a0 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  be.    ** create
105b0 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61  d in the temp da
105c0 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65  tabase that refe
105d0 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e  rs to a table in
105e0 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
105f0 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
10600 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
10610 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
10620 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
10630 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
10640 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e  E tbl_name=%Q an
10650 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  d type!='trigger
10660 27 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d  '",.        pDb-
10670 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  >zName, SCHEMA_T
10680 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d  ABLE(iDb), pTab-
10690 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a  >zName);..    /*
106a0 20 44 72 6f 70 20 61 6e 79 20 73 74 61 74 69 73   Drop any statis
106b0 74 69 63 73 20 66 72 6f 6d 20 74 68 65 20 73 71  tics from the sq
106c0 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65  lite_stat1 table
106d0 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a  , if it exists *
106e0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
106f0 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22  3FindTable(db, "
10700 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 64  sqlite_stat1", d
10710 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
10720 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
10730 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
10740 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
10750 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73  DELETE FROM %Q.s
10760 71 6c 69 74 65 5f 73 74 61 74 31 20 57 48 45 52  qlite_stat1 WHER
10770 45 20 74 62 6c 3d 25 51 22 2c 20 70 44 62 2d 3e  E tbl=%Q", pDb->
10780 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
10790 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
107a0 7d 0a 0a 20 20 20 20 69 66 28 20 21 69 73 56 69  }..    if( !isVi
107b0 65 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  ew && !IsVirtual
107c0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
107d0 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61  destroyTable(pPa
107e0 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  rse, pTab);.    
107f0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  }..    /* Remove
10800 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
10810 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69   from SQLite's i
10820 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61  nternal schema a
10830 6e 64 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a  nd modify.    **
10840 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
10850 69 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ie..    */.    i
10860 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
10870 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  b) ){.      sqli
10880 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
10890 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44   OP_VDestroy, iD
108a0 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  b, 0, 0, pTab->z
108b0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
108c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
108d0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
108e0 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30  Table, iDb, 0, 0
108f0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
10900 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
10910 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
10920 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73  e, iDb);.  }.  s
10930 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
10940 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69  l(db, iDb);..exi
10950 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20  t_drop_table:.  
10960 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
10970 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b  lete(db, pName);
10980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
10990 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
109a0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
109b0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20   foreign key on 
109c0 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72  the table.** cur
109d0 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
109e0 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f  struction.  pFro
109f0 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20  mCol determines 
10a00 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  which columns.**
10a10 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
10a20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74  table point to t
10a30 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20  he foreign key. 
10a40 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20   If pFromCol==0 
10a50 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20  then.** connect 
10a60 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c  the key to the l
10a70 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72  ast column inser
10a80 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65  ted.  pTo is the
10a90 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20   name of.** the 
10aa0 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74  table referred t
10ab0 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20  o.  pToCol is a 
10ac0 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  list of tables i
10ad0 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70  n the other.** p
10ae0 54 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74 68  To table that th
10af0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f  e foreign key po
10b00 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20  ints to.  flags 
10b10 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20  contains all.** 
10b20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
10b30 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72  t the conflict r
10b40 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
10b50 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a  thms specified.*
10b60 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45  * in the ON DELE
10b70 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e  TE, ON UPDATE an
10b80 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75  d ON INSERT clau
10b90 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b  ses..**.** An FK
10ba0 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ey structure is 
10bb0 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65  created and adde
10bc0 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  d to the table c
10bd0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65  urrently.** unde
10be0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
10bf0 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e  n the pParse->pN
10c00 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20  ewTable field.  
10c10 54 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20  The new FKey.** 
10c20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e  is not linked in
10c30 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20  to db->aFKey at 
10c40 74 68 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61  this point - tha
10c50 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65  t does not happe
10c60 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74  n.** until sqlit
10c70 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a  e3EndTable()..**
10c80 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20  .** The foreign 
10c90 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49  key is set for I
10ca0 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73  MMEDIATE process
10cb0 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65  ing.  A subseque
10cc0 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71  nt call.** to sq
10cd0 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
10ce0 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61  nKey() might cha
10cf0 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45  nge this to DEFE
10d00 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  RRED..*/.void sq
10d10 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69  lite3CreateForei
10d20 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  gnKey(.  Parse *
10d30 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
10d40 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
10d50 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10d60 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f  pFromCol,  /* Co
10d70 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61  lumns in this ta
10d80 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ble that point t
10d90 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  o other table */
10da0 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20  .  Token *pTo,  
10db0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
10dc0 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  of the other tab
10dd0 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
10de0 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20   *pToCol,    /* 
10df0 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  Columns in the o
10e00 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
10e10 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
10e20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
10e30 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
10e40 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20  rithms. */.){.  
10e50 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
10e60 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65  arse->db;.#ifnde
10e70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
10e80 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79  REIGN_KEY.  FKey
10e90 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54   *pFKey = 0;.  T
10ea0 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65  able *p = pParse
10eb0 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
10ec0 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
10ed0 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  i;.  int nCol;. 
10ee0 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73   char *z;..  ass
10ef0 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20  ert( pTo!=0 );. 
10f00 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
10f10 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 49 4e 5f  rse->nErr || IN_
10f20 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67  DECLARE_VTAB ) g
10f30 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66  oto fk_end;.  if
10f40 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
10f50 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
10f60 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69  p->nCol-1;.    i
10f70 66 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f  f( iCol<0 ) goto
10f80 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28   fk_end;.    if(
10f90 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
10fa0 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  l->nExpr!=1 ){. 
10fb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10fc0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f  rMsg(pParse, "fo
10fd0 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22  reign key on %s"
10fe0 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75  .         " shou
10ff0 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  ld reference onl
11000 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  y one column of 
11010 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20  table %T",.     
11020 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c      p->aCol[iCol
11030 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20  ].zName, pTo);. 
11040 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
11050 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c  ;.    }.    nCol
11060 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
11070 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
11080 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d  ol->nExpr!=pFrom
11090 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Col->nExpr ){.  
110a0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
110b0 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
110c0 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    "number of col
110d0 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
110e0 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
110f0 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
11100 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75   ".        "colu
11110 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
11120 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20  enced table");. 
11130 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
11140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
11150 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  l = pFromCol->nE
11160 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  xpr;.  }.  nByte
11170 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79   = sizeof(*pFKey
11180 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28  ) + nCol*sizeof(
11190 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20  pFKey->aCol[0]) 
111a0 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20  + pTo->n + 1;.  
111b0 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
111c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f    for(i=0; i<pTo
111d0 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  Col->nExpr; i++)
111e0 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
111f0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
11200 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
11210 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  ame) + 1;.    }.
11220 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71    }.  pFKey = sq
11230 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
11240 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  o(db, nByte );. 
11250 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b   if( pFKey==0 ){
11260 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
11270 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70  ;.  }.  pFKey->p
11280 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65  From = p;.  pFKe
11290 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70  y->pNextFrom = p
112a0 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28  ->pFKey;.  z = (
112b0 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b  char*)&pFKey[1];
112c0 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d  .  pFKey->aCol =
112d0 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70   (struct sColMap
112e0 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65  *)z;.  z += size
112f0 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61  of(struct sColMa
11300 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79  p)*nCol;.  pFKey
11310 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d  ->zTo = z;.  mem
11320 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70  cpy(z, pTo->z, p
11330 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d  To->n);.  z[pTo-
11340 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20  >n] = 0;.  z += 
11350 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65  pTo->n+1;.  pFKe
11360 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a  y->pNextTo = 0;.
11370 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20    pFKey->nCol = 
11380 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f  nCol;.  if( pFro
11390 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mCol==0 ){.    p
113a0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46  FKey->aCol[0].iF
113b0 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  rom = p->nCol-1;
113c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
113d0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
113e0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
113f0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
11400 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29   j<p->nCol; j++)
11410 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
11420 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e  lite3StrICmp(p->
11430 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[j].zName, p
11440 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
11450 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
11460 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
11470 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20  [i].iFrom = j;. 
11480 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
11490 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
114a0 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70  }.      if( j>=p
114b0 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
114c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
114d0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
114e0 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f       "unknown co
114f0 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66  lumn \"%s\" in f
11500 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
11510 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20  ition", .       
11520 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69     pFromCol->a[i
11530 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
11540 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
11550 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11560 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
11570 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11580 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
11590 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
115a0 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c  3Strlen30(pToCol
115b0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
115c0 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
115d0 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20  [i].zCol = z;.  
115e0 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54      memcpy(z, pT
115f0 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
11600 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d  , n);.      z[n]
11610 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d   = 0;.      z +=
11620 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n+1;.    }.  }.
11630 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
11640 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79  red = 0;.  pFKey
11650 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 28  ->deleteConf = (
11660 75 38 29 28 66 6c 61 67 73 20 26 20 30 78 66 66  u8)(flags & 0xff
11670 29 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61  );.  pFKey->upda
11680 74 65 43 6f 6e 66 20 3d 20 28 75 38 29 28 28 66  teConf = (u8)((f
11690 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78  lags >> 8 ) & 0x
116a0 66 66 29 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e  ff);.  pFKey->in
116b0 73 65 72 74 43 6f 6e 66 20 3d 20 28 75 38 29 28  sertConf = (u8)(
116c0 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26  (flags >> 16 ) &
116d0 20 30 78 66 66 29 3b 0a 0a 20 20 2f 2a 20 4c 69   0xff);..  /* Li
116e0 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  nk the foreign k
116f0 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ey to the table 
11700 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70  as the last step
11710 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65  ..  */.  p->pFKe
11720 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b  y = pFKey;.  pFK
11730 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a  ey = 0;..fk_end:
11740 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
11750 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e  (db, pFKey);.#en
11760 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
11770 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
11780 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71  IGN_KEY) */.  sq
11790 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
117a0 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c  ete(db, pFromCol
117b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
117c0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
117d0 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ToCol);.}../*.**
117e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
117f0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
11800 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
11810 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59  ATE or INITIALLY
11820 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61   DEFERRED.** cla
11830 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70  use is seen as p
11840 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e  art of a foreign
11850 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e   key definition.
11860 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64    The isDeferred
11870 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
11880 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   1 for INITIALLY
11890 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20   DEFERRED and 0 
118a0 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d  for INITIALLY IM
118b0 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20  MEDIATE..** The 
118c0 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20  behavior of the 
118d0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72  most recently cr
118e0 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  eated foreign ke
118f0 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a  y is adjusted.**
11900 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f   accordingly..*/
11910 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
11920 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72  erForeignKey(Par
11930 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
11940 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66  isDeferred){.#if
11950 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11960 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54  _FOREIGN_KEY.  T
11970 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b  able *pTab;.  FK
11980 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28  ey *pFKey;.  if(
11990 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   (pTab = pParse-
119a0 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c  >pNewTable)==0 |
119b0 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d  | (pFKey = pTab-
119c0 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74  >pFKey)==0 ) ret
119d0 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69  urn;.  assert( i
119e0 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20  sDeferred==0 || 
119f0 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b  isDeferred==1 );
11a00 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
11a10 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65 66  rred = (u8)isDef
11a20 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a  erred;.#endif.}.
11a30 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
11a40 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
11a50 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20  rase and refill 
11a60 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68  index *pIdx.  Th
11a70 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  is is.** used to
11a80 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
11a90 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65  wly created inde
11aa0 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74  x or to recomput
11ab0 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  e the.** content
11ac0 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20   of an index in 
11ad0 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45  response to a RE
11ae0 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
11af0 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50  *.** if memRootP
11b00 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74  age is not negat
11b10 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ive, it means th
11b20 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  at the index is 
11b30 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64  newly.** created
11b40 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20  .  The register 
11b50 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d  specified by mem
11b60 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e  RootPage contain
11b70 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
11b80 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
11b90 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52   index.  If memR
11ba0 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74  ootPage is negat
11bb0 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ive, then.** the
11bc0 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
11bd0 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62  xists and must b
11be0 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  e cleared before
11bf0 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20   being refilled 
11c00 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  and.** the root 
11c10 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
11c20 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65  he index is take
11c30 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74  n from pIndex->t
11c40 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  num..*/.static v
11c50 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c  oid sqlite3Refil
11c60 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  lIndex(Parse *pP
11c70 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e  arse, Index *pIn
11c80 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74  dex, int memRoot
11c90 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Page){.  Table *
11ca0 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
11cb0 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74  Table;  /* The t
11cc0 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64  able that is ind
11cd0 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  exed */.  int iT
11ce0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
11cf0 62 3b 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65  b;       /* Btre
11d00 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
11d10 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  r pTab */.  int 
11d20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iIdx = pParse->n
11d30 54 61 62 2b 31 3b 20 20 20 20 20 2f 2a 20 42 74  Tab+1;     /* Bt
11d40 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ree cursor used 
11d50 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20  for pIndex */.  
11d60 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
11d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11d80 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70  * Address of top
11d90 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
11da0 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  t tnum;         
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11dc0 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64  Root page of ind
11dd0 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ex */.  Vdbe *v;
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11df0 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
11e00 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
11e10 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
11e20 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
11e30 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  pKey;           
11e40 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f        /* KeyInfo
11e50 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20   for index */.  
11e60 69 6e 74 20 72 65 67 49 64 78 4b 65 79 3b 20 20  int regIdxKey;  
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11e80 2a 20 52 65 67 69 73 74 65 72 73 20 63 6f 6e 74  * Registers cont
11e90 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  aining the index
11ea0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 72 65   key */.  int re
11eb0 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20  gRecord;        
11ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
11ed0 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73  ster holding ass
11ee0 65 6d 62 6c 69 65 64 20 69 6e 64 65 78 20 72 65  emblied index re
11ef0 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cord */.  sqlite
11f00 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
11f10 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  db;      /* The 
11f20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
11f30 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ion */.  int iDb
11f40 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
11f50 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
11f60 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23  ex->pSchema);..#
11f70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11f80 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
11f90 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
11fa0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
11fb0 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20  SQLITE_REINDEX, 
11fc0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
11fd0 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
11fe0 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a  iDb].zName ) ){.
11ff0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
12000 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71  #endif..  /* Req
12010 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
12020 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  k on the table t
12030 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f  o perform this o
12040 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  peration */.  sq
12050 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
12060 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
12070 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d  ->tnum, 1, pTab-
12080 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20  >zName);..  v = 
12090 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
120a0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
120b0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
120c0 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  f( memRootPage>=
120d0 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  0 ){.    tnum = 
120e0 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d  memRootPage;.  }
120f0 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  else{.    tnum =
12100 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20   pIndex->tnum;. 
12110 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12120 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72  dOp2(v, OP_Clear
12130 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  , tnum, iDb);.  
12140 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74  }.  pKey = sqlit
12150 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
12160 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a  Parse, pIndex);.
12170 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12180 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op4(v, OP_OpenWr
12190 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c  ite, iIdx, tnum,
121a0 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20   iDb, .         
121b0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
121c0 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49   *)pKey, P4_KEYI
121d0 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
121e0 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  if( memRootPage>
121f0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
12200 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
12210 20 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   1);.  }.  sqlit
12220 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
12230 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
12240 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
12250 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
12260 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12270 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  , OP_Rewind, iTa
12280 62 2c 20 30 29 3b 0a 20 20 72 65 67 52 65 63 6f  b, 0);.  regReco
12290 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
122a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
122b0 20 20 72 65 67 49 64 78 4b 65 79 20 3d 20 73 71    regIdxKey = sq
122c0 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
122d0 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49  exKey(pParse, pI
122e0 6e 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67 52  ndex, iTab, regR
122f0 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 69 66 28  ecord, 1);.  if(
12300 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
12310 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20  !=OE_None ){.   
12320 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20   int j1, j2;.   
12330 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a   int regRowid;..
12340 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 72      regRowid = r
12350 65 67 49 64 78 4b 65 79 20 2b 20 70 49 6e 64 65  egIdxKey + pInde
12360 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  x->nColumn;.    
12370 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
12380 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 73 4e  AddOp3(v, OP_IsN
12390 75 6c 6c 2c 20 72 65 67 49 64 78 4b 65 79 2c 20  ull, regIdxKey, 
123a0 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  0, pIndex->nColu
123b0 6d 6e 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71  mn);.    j2 = sq
123c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
123d0 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65 2c 20  v, OP_IsUnique, 
123e0 69 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20  iIdx,.          
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12400 20 30 2c 20 72 65 67 52 6f 77 69 64 2c 20 53 51   0, regRowid, SQ
12410 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
12420 72 65 67 52 65 63 6f 72 64 29 2c 20 50 34 5f 49  regRecord), P4_I
12430 4e 54 33 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  NT32);.    sqlit
12440 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
12450 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
12460 43 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45 5f 41  CONSTRAINT, OE_A
12470 62 6f 72 74 2c 20 30 2c 0a 20 20 20 20 20 20 20  bort, 0,.       
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 22 69 6e               "in
12490 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  dexed columns ar
124a0 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50  e not unique", P
124b0 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  4_STATIC);.    s
124c0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
124d0 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73  re(v, j1);.    s
124e0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
124f0 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 7d 0a 20  re(v, j2);.  }. 
12500 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12510 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
12520 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63  rt, iIdx, regRec
12530 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ord);.  sqlite3R
12540 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
12550 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
12560 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12570 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
12580 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29  , iTab, addr1+1)
12590 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
125a0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
125b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
125c0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
125d0 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c  se, iTab);.  sql
125e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
125f0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78  , OP_Close, iIdx
12600 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
12610 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66  te a new index f
12620 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e  or an SQL table.
12630 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20    pName1.pName2 
12640 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
12650 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64  he index .** and
12660 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65   pTblList is the
12670 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
12680 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
12690 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20   indexed.  Both 
126a0 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c  will .** be NULL
126b0 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b   for a primary k
126c0 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  ey or an index t
126d0 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74  hat is created t
126e0 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55  o satisfy a.** U
126f0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
12700 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64  .  If pTable and
12710 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c   pIndex are NULL
12720 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  , use pParse->pN
12730 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68  ewTable.** as th
12740 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
12750 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e  dexed.  pParse->
12760 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74  pNewTable is a t
12770 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  able that is.** 
12780 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
12790 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61  constructed by a
127a0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
127b0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70  atement..**.** p
127c0 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
127d0 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
127e0 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20  indexed.  pList 
127f0 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
12800 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69  this.** is a pri
12810 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71  mary key or uniq
12820 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ue-constraint on
12830 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
12840 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a   column added.**
12850 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
12860 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
12870 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f  nstruction.  .*/
12880 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
12890 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
128a0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
128b0 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
128c0 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
128d0 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
128e0 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69  Name1,     /* Fi
128f0 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65  rst part of inde
12900 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
12910 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
12920 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53  pName2,     /* S
12930 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e  econd part of in
12940 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
12950 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
12960 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a  st *pTblName, /*
12970 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   Table to index.
12980 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
12990 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
129a0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
129b0 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
129c0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
129d0 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
129e0 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  onError,       /
129f0 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49  * OE_Abort, OE_I
12a00 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63  gnore, OE_Replac
12a10 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f  e, or OE_None */
12a20 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
12a30 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
12a40 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
12a50 65 67 69 6e 73 20 74 68 69 73 20 73 74 61 74 65  egins this state
12a60 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
12a70 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20  *pEnd,       /* 
12a80 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f  The ")" that clo
12a90 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49  ses the CREATE I
12aa0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
12ab0 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
12ac0 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f  r,     /* Sort o
12ad0 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20  rder of primary 
12ae0 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d  key when pList==
12af0 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66  NULL */.  int if
12b00 4e 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20  NotExist     /* 
12b10 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e  Omit error if in
12b20 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
12b30 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
12b40 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
12b50 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
12b60 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
12b70 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20  x *pIndex = 0;  
12b80 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
12b90 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20   be created */. 
12ba0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
12bb0 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
12bc0 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
12bd0 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
12be0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12bf0 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
12c00 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69  zName */.  int i
12c10 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c  , j;.  Token nul
12c20 6c 49 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  lId;        /* F
12c30 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e  ake token for an
12c40 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a   empty ID list *
12c50 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  /.  DbFixer sFix
12c60 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ;        /* For 
12c70 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61  assigning databa
12c80 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62  se names to pTab
12c90 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  le */.  int sort
12ca0 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20  OrderMask;   /* 
12cb0 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20  1 to honor DESC 
12cc0 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20  in index.  0 to 
12cd0 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c  ignore. */.  sql
12ce0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
12cf0 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62  e->db;.  Db *pDb
12d00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
12d10 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74 61   The specific ta
12d20 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
12d30 68 65 20 69 6e 64 65 78 65 64 20 64 61 74 61 62  he indexed datab
12d40 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
12d50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
12d60 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   Index of the da
12d70 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62  tabase that is b
12d80 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a  eing written */.
12d90 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
12da0 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c   0;    /* Unqual
12db0 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
12dc0 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74  e index to creat
12dd0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  e */.  struct Ex
12de0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69  prList_item *pLi
12df0 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c  stItem; /* For l
12e00 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73  ooping over pLis
12e10 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t */.  int nCol;
12e20 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20  .  int nExtra = 
12e30 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  0;.  char *zExtr
12e40 61 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  a;..  if( pParse
12e50 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
12e60 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e  llocFailed || IN
12e70 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
12e80 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
12e90 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
12ea0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
12eb0 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
12ec0 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
12ed0 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  .  Return early 
12ee0 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
12ef0 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  */.  if( pTblNam
12f00 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e!=0 ){..    /* 
12f10 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74  Use the two-part
12f20 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64   index name to d
12f30 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74  etermine the dat
12f40 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f  abase .    ** to
12f50 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   search for the 
12f60 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65  table. 'Fix' the
12f70 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
12f80 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65  his db.    ** be
12f90 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20  fore looking up 
12fa0 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
12fb0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  /.    assert( pN
12fc0 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29  ame1 && pName2 )
12fd0 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
12fe0 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
12ff0 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
13000 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
13010 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20      if( iDb<0 ) 
13020 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13030 5f 69 6e 64 65 78 3b 0a 0a 23 69 66 6e 64 65 66  _index;..#ifndef
13040 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d   SQLITE_OMIT_TEM
13050 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  PDB.    /* If th
13060 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73  e index name was
13070 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68   unqualified, ch
13080 65 63 6b 20 69 66 20 74 68 65 20 74 68 65 20 74  eck if the the t
13090 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61  able.    ** is a
130a0 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20   temp table. If 
130b0 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  so, set the data
130c0 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f  base to 1. Do no
130d0 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a  t do this.    **
130e0 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67   if initialising
130f0 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65   a database sche
13100 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ma..    */.    i
13110 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
13120 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  y ){.      pTab 
13130 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
13140 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
13150 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TblName);.      
13160 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e  if( pName2 && pN
13170 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54  ame2->n==0 && pT
13180 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  ab && pTab->pSch
13190 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
131a0 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
131b0 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20     iDb = 1;.    
131c0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
131d0 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
131e0 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
131f0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e  pParse, iDb, "in
13200 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a  dex", pName) &&.
13210 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
13220 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c  ixSrcList(&sFix,
13230 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29   pTblName).    )
13240 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75  {.      /* Becau
13250 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63 6f  se the parser co
13260 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d  nstructs pTblNam
13270 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  e from a single 
13280 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20  identifier,.    
13290 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53    ** sqlite3FixS
132a0 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72  rcList can never
132b0 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   fail. */.      
132c0 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d  assert(0);.    }
132d0 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
132e0 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
132f0 50 61 72 73 65 2c 20 30 2c 20 70 54 62 6c 4e 61  Parse, 0, pTblNa
13300 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
13310 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d  .        pTblNam
13320 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
13330 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  e);.    if( !pTa
13340 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
13350 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69  ailed ) goto exi
13360 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13370 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
13380 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
13390 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
133a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
133b0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30  assert( pName==0
133c0 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70   );.    pTab = p
133d0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
133e0 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20  ;.    if( !pTab 
133f0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
13400 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44  te_index;.    iD
13410 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
13420 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
13430 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  b->pSchema);.  }
13440 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
13450 62 5b 69 44 62 5d 3b 0a 0a 20 20 69 66 28 20 70  b[iDb];..  if( p
13460 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  Tab==0 || pParse
13470 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78  ->nErr ) goto ex
13480 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13490 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
134a0 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
134b0 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
134c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
134d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
134e0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
134f0 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
13500 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
13510 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
13520 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
13530 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13540 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
13550 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
13560 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
13570 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
13580 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  ews may not be i
13590 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
135a0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
135b0 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ndex;.  }.#endif
135c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
135d0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
135e0 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
135f0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
13600 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13610 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20  Parse, "virtual 
13620 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62  tables may not b
13630 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
13640 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13650 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
13660 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  dif..  /*.  ** F
13670 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ind the name of 
13680 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  the index.  Make
13690 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
136a0 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68  ot already anoth
136b0 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  er.  ** index or
136c0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
136d0 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a  same name.  .  *
136e0 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e  *.  ** Exception
136f0 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61  :  If we are rea
13700 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f  ding the names o
13710 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69  f permanent indi
13720 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ces from the.  *
13730 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
13740 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73  table (because s
13750 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
13760 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63  s changed the sc
13770 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f  hema) and.  ** o
13780 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ne of the index 
13790 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77  names collides w
137a0 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ith the name of 
137b0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
137c0 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c  e or.  ** index,
137d0 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f   then we will co
137e0 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73  ntinue to proces
137f0 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  s this index..  
13800 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65  **.  ** If pName
13810 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ==0 it means tha
13820 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65  t we are.  ** de
13830 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69  aling with a pri
13840 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51  mary key or UNIQ
13850 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
13860 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e  We have to inven
13870 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e  t our.  ** own n
13880 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
13890 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
138a0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
138b0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
138c0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ame);.    if( SQ
138d0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
138e0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
138f0 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  e) ) goto exit_c
13900 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13910 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
13920 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13930 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
13940 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
13950 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
13960 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
13970 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
13980 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
139a0 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
139b0 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  {.      if( SQLI
139c0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
139d0 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
139e0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
139f0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
13a00 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
13a10 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
13a20 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
13a30 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13a40 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
13a50 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61   is already a ta
13a60 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  ble named %s", z
13a70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
13a80 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
13a90 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
13aa0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
13ab0 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
13ac0 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e  , zName, pDb->zN
13ad0 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
13ae0 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74   if( !ifNotExist
13af0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13b00 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13b10 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c  se, "index %s al
13b20 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a  ready exists", z
13b30 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
13b40 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
13b50 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13b60 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
13b70 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78  int n;.    Index
13b80 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72   *pLoop;.    for
13b90 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e  (pLoop=pTab->pIn
13ba0 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b  dex, n=1; pLoop;
13bb0 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e   pLoop=pLoop->pN
13bc0 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  ext, n++){}.    
13bd0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
13be0 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69  Printf(db, "sqli
13bf0 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f  te_autoindex_%s_
13c00 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %d", pTab->zName
13c10 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  , n);.    if( zN
13c20 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
13c30 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13c40 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
13c50 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
13c60 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
13c70 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
13c80 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
13c90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13ca0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
13cb0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
13cc0 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b  Db = pDb->zName;
13cd0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13ce0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
13cf0 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
13d00 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
13d10 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  b), 0, zDb) ){. 
13d20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
13d30 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13d40 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
13d50 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
13d60 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
13d70 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
13d80 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
13d90 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
13da0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
13db0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
13dc0 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
13dd0 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
13de0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
13df0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13e00 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
13e10 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
13e20 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
13e30 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
13e40 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
13e50 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
13e60 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
13e70 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
13e80 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
13e90 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
13ea0 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
13eb0 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
13ec0 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
13ed0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
13ee0 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 28 75     nullId.z = (u
13ef0 38 2a 29 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54  8*)pTab->aCol[pT
13f00 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d  ab->nCol-1].zNam
13f10 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20  e;.    nullId.n 
13f20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
13f30 30 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e  0((char*)nullId.
13f40 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  z);.    pList = 
13f50 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
13f60 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
13f70 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20   0, &nullId);.  
13f80 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
13f90 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13fa0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 4c 69  e_index;.    pLi
13fb0 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  st->a[0].sortOrd
13fc0 65 72 20 3d 20 28 75 38 29 73 6f 72 74 4f 72 64  er = (u8)sortOrd
13fd0 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  er;.  }..  /* Fi
13fe0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
13ff0 79 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  y bytes of space
14000 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
14010 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c   store explicitl
14020 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64  y.  ** specified
14030 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
14040 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a  nce names..  */.
14050 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
14060 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
14070 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
14080 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ;.    CollSeq *p
14090 43 6f 6c 6c 3b 0a 20 20 20 20 69 66 28 20 28 70  Coll;.    if( (p
140a0 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
140b0 69 5d 2e 70 45 78 70 72 29 21 3d 30 20 26 26 20  i].pExpr)!=0 && 
140c0 28 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e  (pColl = pExpr->
140d0 70 43 6f 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20  pColl)!=0 ){.   
140e0 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20     nExtra += (1 
140f0 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  + sqlite3Strlen3
14100 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29  0(pColl->zName))
14110 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
14120 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
14130 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
14140 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e  ture. .  */.  nN
14150 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
14160 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
14170 6e 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nCol = pList->nE
14180 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  xpr;.  pIndex = 
14190 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
141a0 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 73  ero(db, .      s
141b0 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 20  izeof(Index) +  
141c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
141d0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20  ndex structure  
141e0 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
141f0 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20  int)*nCol +     
14200 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
14210 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20  iColumn   */.   
14220 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28     sizeof(int)*(
14230 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 20 20  nCol+1) +       
14240 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  /* Index.aiRowEs
14250 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a  t   */.      siz
14260 65 6f 66 28 63 68 61 72 20 2a 29 2a 6e 43 6f 6c  eof(char *)*nCol
14270 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64   +        /* Ind
14280 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f  ex.azColl     */
14290 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38  .      sizeof(u8
142a0 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
142b0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
142c0 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  rtOrder */.     
142d0 20 6e 4e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20   nName + 1 +    
142e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
142f0 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20 20   Index.zName    
14300 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74 72    */.      nExtr
14310 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a               
14320 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
14330 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
14340 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66  mes */.  );.  if
14350 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
14360 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
14370 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14380 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e  ;.  }.  pIndex->
14390 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a  azColl = (char**
143a0 29 28 26 70 49 6e 64 65 78 5b 31 5d 29 3b 0a 20  )(&pIndex[1]);. 
143b0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
143c0 6e 20 3d 20 28 69 6e 74 20 2a 29 28 26 70 49 6e  n = (int *)(&pIn
143d0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c  dex->azColl[nCol
143e0 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69  ]);.  pIndex->ai
143f0 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e  RowEst = (unsign
14400 65 64 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61  ed *)(&pIndex->a
14410 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a  iColumn[nCol]);.
14420 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
14430 72 64 65 72 20 3d 20 28 75 38 20 2a 29 28 26 70  rder = (u8 *)(&p
14440 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b  Index->aiRowEst[
14450 6e 43 6f 6c 2b 31 5d 29 3b 0a 20 20 70 49 6e 64  nCol+1]);.  pInd
14460 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  ex->zName = (cha
14470 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 53  r *)(&pIndex->aS
14480 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b  ortOrder[nCol]);
14490 0a 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68 61  .  zExtra = (cha
144a0 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 7a 4e  r *)(&pIndex->zN
144b0 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20  ame[nName+1]);. 
144c0 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e   memcpy(pIndex->
144d0 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
144e0 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78  ame+1);.  pIndex
144f0 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b  ->pTable = pTab;
14500 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  .  pIndex->nColu
14510 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  mn = pList->nExp
14520 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  r;.  pIndex->onE
14530 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72  rror = (u8)onErr
14540 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75  or;.  pIndex->au
14550 74 6f 49 6e 64 65 78 20 3d 20 28 75 38 29 28 70  toIndex = (u8)(p
14560 4e 61 6d 65 3d 3d 30 29 3b 0a 20 20 70 49 6e 64  Name==0);.  pInd
14570 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62  ex->pSchema = db
14580 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
14590 6d 61 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ma;..  /* Check 
145a0 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f  to see if we sho
145b0 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72  uld honor DESC r
145c0 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78  equests on index
145d0 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20   columns.  */.  
145e0 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
145f0 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ->file_format>=4
14600 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65   ){.    sortOrde
14610 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a  rMask = -1;   /*
14620 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20   Honor DESC */. 
14630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74   }else{.    sort
14640 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20  OrderMask = 0;  
14650 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43    /* Ignore DESC
14660 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63   */.  }..  /* Sc
14670 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  an the names of 
14680 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
14690 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
146a0 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20  ndexed and.  ** 
146b0 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
146c0 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65  indices into the
146d0 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
146e0 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
146f0 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63  or.  ** if any c
14700 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75  olumn is not fou
14710 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  nd..  */.  for(i
14720 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c  =0, pListItem=pL
14730 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
14740 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69  >nExpr; i++, pLi
14750 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63  stItem++){.    c
14760 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e  onst char *zColN
14770 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  ame = pListItem-
14780 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75  >zName;.    Colu
14790 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20  mn *pTabCol;.   
147a0 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f   int requestedSo
147b0 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61  rtOrder;.    cha
147c0 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
147d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
147e0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
147f0 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66  e name */..    f
14800 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d  or(j=0, pTabCol=
14810 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54  pTab->aCol; j<pT
14820 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
14830 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  TabCol++){.     
14840 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
14850 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54  Cmp(zColName, pT
14860 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30  abCol->zName)==0
14870 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
14880 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d      if( j>=pTab-
14890 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  >nCol ){.      s
148a0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
148b0 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
148c0 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e   has no column n
148d0 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20  amed %s",.      
148e0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a    pTab->zName, z
148f0 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ColName);.      
14900 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
14910 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
14920 20 20 2f 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20    /* TODO:  Add 
14930 61 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 73  a test to make s
14940 75 72 65 20 74 68 61 74 20 74 68 65 20 73 61 6d  ure that the sam
14950 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20  e column is not 
14960 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 6d 6f 72  named.    ** mor
14970 65 20 74 68 61 6e 20 6f 6e 63 65 20 77 69 74 68  e than once with
14980 69 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  in the same inde
14990 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72  x.  Only the fir
149a0 73 74 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20  st instance of. 
149b0 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e     ** the column
149c0 20 77 69 6c 6c 20 65 76 65 72 20 62 65 20 75 73   will ever be us
149d0 65 64 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69  ed by the optimi
149e0 7a 65 72 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  zer.  Note that 
149f0 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  using the.    **
14a00 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72   same column mor
14a10 65 20 74 68 61 6e 20 6f 6e 63 65 20 63 61 6e 6e  e than once cann
14a20 6f 74 20 62 65 20 61 6e 20 65 72 72 6f 72 20 62  ot be an error b
14a30 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
14a40 64 20 0a 20 20 20 20 2a 2a 20 62 72 65 61 6b 20  d .    ** break 
14a50 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
14a60 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65  ibility - it nee
14a70 64 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69  ds to be a warni
14a80 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ng..    */.    p
14a90 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
14aa0 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20  i] = j;.    if( 
14ab0 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
14ac0 20 26 26 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70   && pListItem->p
14ad0 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 7b 0a 20  Expr->pColl ){. 
14ae0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
14af0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70  stItem->pExpr->p
14b00 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 7a 43  Coll );.      zC
14b10 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20  oll = zExtra;.  
14b20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
14b30 69 6e 74 66 28 6e 45 78 74 72 61 2c 20 7a 45 78  intf(nExtra, zEx
14b40 74 72 61 2c 20 22 25 73 22 2c 20 70 4c 69 73 74  tra, "%s", pList
14b50 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f  Item->pExpr->pCo
14b60 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
14b70 20 20 7a 45 78 74 72 61 20 2b 3d 20 28 73 71 6c    zExtra += (sql
14b80 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f  ite3Strlen30(zCo
14b90 6c 6c 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 65  ll) + 1);.    }e
14ba0 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  lse{.      zColl
14bb0 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
14bc0 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66  .zColl;.      if
14bd0 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !zColl ){.    
14be0 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d 3e      zColl = db->
14bf0 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  pDfltColl->zName
14c00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14c10 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
14c20 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74  t.busy && !sqlit
14c30 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
14c40 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d  pParse, zColl, -
14c50 31 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  1) ){.      goto
14c60 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14c70 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
14c80 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
14c90 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71  = zColl;.    req
14ca0 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20  uestedSortOrder 
14cb0 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72  = pListItem->sor
14cc0 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64  tOrder & sortOrd
14cd0 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64  erMask;.    pInd
14ce0 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
14cf0 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73 74 65  ] = (u8)requeste
14d00 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  dSortOrder;.  }.
14d10 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74    sqlite3Default
14d20 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a  RowEst(pIndex);.
14d30 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61  .  if( pTab==pPa
14d40 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
14d50 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f  {.    /* This ro
14d60 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63  utine has been c
14d70 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
14d80 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
14d90 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72  ex as a.    ** r
14da0 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41  esult of a PRIMA
14db0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
14dc0 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c   clause on a col
14dd0 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20  umn definition, 
14de0 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d  or.    ** a PRIM
14df0 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
14e00 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69  E clause followi
14e10 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65  ng the column de
14e20 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  finitions..    *
14e30 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20  * i.e. one of:. 
14e40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45     **.    ** CRE
14e50 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52  ATE TABLE t(x PR
14e60 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20  IMARY KEY, y);. 
14e70 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
14e80 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55  LE t(x, y, UNIQU
14e90 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a  E(x, y));.    **
14ea0 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77  .    ** Either w
14eb0 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ay, check to see
14ec0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   if the table al
14ed0 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61  ready has such a
14ee0 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20  n index. If.    
14ef0 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74  ** so, don't bot
14f00 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69  her creating thi
14f10 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79  s one. This only
14f20 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20   applies to.    
14f30 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
14f40 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73   created indices
14f50 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61  . Users can do a
14f60 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68  s they wish with
14f70 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74  .    ** explicit
14f80 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f   indices..    */
14f90 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
14fa0 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
14fb0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
14fc0 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
14fd0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
14fe0 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
14ff0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
15000 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20  OE_None );.     
15010 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
15020 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20 20  utoIndex );.    
15030 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
15040 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
15050 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  ne );..      if(
15060 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d   pIdx->nColumn!=
15070 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
15080 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
15090 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64    for(k=0; k<pId
150a0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29  x->nColumn; k++)
150b0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
150c0 63 68 61 72 20 2a 7a 31 20 3d 20 70 49 64 78 2d  char *z1 = pIdx-
150d0 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20  >azColl[k];.    
150e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
150f0 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  z2 = pIndex->azC
15100 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  oll[k];.        
15110 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
15120 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61  mn[k]!=pIndex->a
15130 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65  iColumn[k] ) bre
15140 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
15150 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
15160 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 53 6f  [k]!=pIndex->aSo
15170 72 74 4f 72 64 65 72 5b 6b 5d 20 29 20 62 72 65  rtOrder[k] ) bre
15180 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
15190 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74 65  z1!=z2 && sqlite
151a0 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
151b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
151c0 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70  }.      if( k==p
151d0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  Idx->nColumn ){.
151e0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
151f0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65  ->onError!=pInde
15200 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  x->onError ){.  
15210 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
15220 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74  constraint creat
15230 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  es the same inde
15240 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a  x as a previous.
15250 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
15260 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65  straint specifie
15270 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74  d somewhere in t
15280 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
15290 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
152a0 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20       ** However 
152b0 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  the ON CONFLICT 
152c0 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66  clauses are diff
152d0 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74  erent. If both t
152e0 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  his .          *
152f0 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  * constraint and
15300 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71   the previous eq
15310 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61  uivalent constra
15320 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69  int have explici
15330 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f  t.          ** O
15340 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
15350 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72  es this is an er
15360 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ror. Otherwise, 
15370 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  use the.        
15380 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20    ** explicitly 
15390 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69  specified behavi
153a0 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  our for the inde
153b0 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  x..          */.
153c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
153d0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
153e0 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e  E_Default || pIn
153f0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
15400 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20  _Default) ){.   
15410 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15420 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15430 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
15440 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f    "conflicting O
15450 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
15460 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30  es specified", 0
15470 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
15480 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
15490 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
154a0 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
154b0 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72        pIdx->onEr
154c0 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e  ror = pIndex->on
154d0 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Error;.         
154e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
154f0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
15500 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
15510 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
15520 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
15530 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  w Index structur
15540 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61  e to its table a
15550 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a  nd to the other.
15560 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    ** in-memory d
15570 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
15580 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  es. .  */.  if( 
15590 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
155a0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
155b0 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
155c0 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78  shInsert(&pIndex
155d0 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
155e0 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sh, .           
155f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15600 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 71  Index->zName, sq
15610 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 49  lite3Strlen30(pI
15620 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 0a  ndex->zName)+1,.
15630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15640 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
15650 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
15660 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
15670 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d  =pIndex );  /* M
15680 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
15690 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
156a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
156b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
156c0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
156d0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  ex;.    }.    db
156e0 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
156f0 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
15700 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
15710 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49  e!=0 ){.      pI
15720 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d  ndex->tnum = db-
15730 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
15740 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
15750 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
15760 75 73 79 20 69 73 20 30 20 74 68 65 6e 20 63 72  usy is 0 then cr
15770 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  eate the index o
15780 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20  n disk.  This.  
15790 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74  ** involves writ
157a0 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e  ing the index in
157b0 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  to the master ta
157c0 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20  ble and filling 
157d0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  in the.  ** inde
157e0 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  x with the curre
157f0 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74  nt table content
15800 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
15810 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
15820 73 20 30 20 77 68 65 6e 20 74 68 65 20 75 73 65  s 0 when the use
15830 72 20 66 69 72 73 74 20 65 6e 74 65 72 73 20 61  r first enters a
15840 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20   CREATE INDEX . 
15850 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62   ** command.  db
15860 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
15870 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
15880 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a   is opened and .
15890 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45    ** CREATE INDE
158a0 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  X statements are
158b0 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65   read out of the
158c0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20   master table.  
158d0 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74  In.  ** the latt
158e0 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64 65  er case the inde
158f0 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
15900 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20   on disk, which 
15910 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64  is why.  ** we d
15920 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63  on't want to rec
15930 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20  reate it..  **. 
15940 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d   ** If pTblName=
15950 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
15960 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61   index is genera
15970 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79  ted as a primary
15980 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49   key.  ** or UNI
15990 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
159a0 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  f a CREATE TABLE
159b0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
159c0 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  ce the table.  *
159d0 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
159e0 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
159f0 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
15a00 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
15a10 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73  alization.  ** s
15a20 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70  tep can be skipp
15a30 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
15a40 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
15a50 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65  y==0 ){.    Vdbe
15a60 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
15a70 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d  Stmt;.    int iM
15a80 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
15a90 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71  Mem;..    v = sq
15aa0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
15ab0 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
15ac0 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
15ad0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20  reate_index;... 
15ae0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
15af0 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68   rootpage for th
15b00 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20  e index.    */. 
15b10 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
15b20 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
15b30 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
15b40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15b50 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74  dOp2(v, OP_Creat
15b60 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d 65  eIndex, iDb, iMe
15b70 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68  m);..    /* Gath
15b80 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  er the complete 
15b90 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
15ba0 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
15bb0 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74  nt into.    ** t
15bc0 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c  he zStmt variabl
15bd0 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
15be0 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20   pStart && pEnd 
15bf0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61  ){.      /* A na
15c00 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61  med index with a
15c10 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54  n explicit CREAT
15c20 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
15c30 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74  t */.      zStmt
15c40 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
15c50 66 28 64 62 2c 20 22 43 52 45 41 54 45 25 73 20  f(db, "CREATE%s 
15c60 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20  INDEX %.*s",.   
15c70 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45       onError==OE
15c80 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55  _None ? "" : " U
15c90 4e 49 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20  NIQUE",.        
15ca0 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d  pEnd->z - pName-
15cb0 3e 7a 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20  >z + 1,.        
15cc0 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d  pName->z);.    }
15cd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
15ce0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
15cf0 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50  x created by a P
15d00 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
15d10 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
15d20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d  */.      /* zStm
15d30 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
15d40 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20  tf(""); */.     
15d50 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   zStmt = 0;.    
15d60 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e  }..    /* Add an
15d70 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65   entry in sqlite
15d80 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73  _master for this
15d90 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20   index.    */.  
15da0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
15db0 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
15dc0 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
15dd0 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28  TO %Q.%s VALUES(
15de0 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25  'index',%Q,%Q,#%
15df0 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20  d,%Q);",.       
15e00 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
15e10 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
15e20 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20  E(iDb),.        
15e30 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20  pIndex->zName,. 
15e40 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
15e50 6d 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d  me,.        iMem
15e60 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a  ,.        zStmt.
15e70 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
15e80 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
15e90 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c  mt);..    /* Fil
15ea0 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  l the index with
15eb0 20 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73   data and repars
15ec0 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f  e the schema. Co
15ed0 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a  de an OP_Expire.
15ee0 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69      ** to invali
15ef0 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d  date all pre-com
15f00 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
15f10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
15f20 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   pTblName ){.   
15f30 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
15f40 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
15f50 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  ndex, iMem);.   
15f60 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
15f70 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
15f80 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
15f90 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
15fa0 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20  OP_ParseSchema, 
15fb0 69 44 62 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  iDb, 0, 0,.     
15fc0 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
15fd0 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71  tf(db, "name='%q
15fe0 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  '", pIndex->zNam
15ff0 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  e), P4_DYNAMIC);
16000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16010 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45  beAddOp1(v, OP_E
16020 78 70 69 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d  xpire, 0);.    }
16030 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
16040 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  adding an index 
16050 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
16060 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62  ndices for a tab
16070 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  le, make.  ** su
16080 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c  re all indices l
16090 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63  abeled OE_Replac
160a0 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c  e come after all
160b0 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20   those labeled. 
160c0 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20   ** OE_Ignore.  
160d0 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
160e0 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63  y for the correc
160f0 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55  t operation of U
16100 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49  PDATE.  ** and I
16110 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  NSERT..  */.  if
16120 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
16130 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29  || pTblName==0 )
16140 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  {.    if( onErro
16150 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c  r!=OE_Replace ||
16160 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30   pTab->pIndex==0
16170 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61  .         || pTa
16180 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  b->pIndex->onErr
16190 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b  or==OE_Replace){
161a0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
161b0 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
161c0 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  dex;.      pTab-
161d0 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
161e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
161f0 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72     Index *pOther
16200 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
16210 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f  .      while( pO
16220 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70  ther->pNext && p
16230 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e  Other->pNext->on
16240 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
16250 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74  e ){.        pOt
16260 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  her = pOther->pN
16270 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
16280 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
16290 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
162a0 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e  ;.      pOther->
162b0 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
162c0 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
162d0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
162e0 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20  Clean up before 
162f0 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f  exiting */.exit_
16300 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20  create_index:.  
16310 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
16320 20 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64    freeIndex(pInd
16330 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ex);.  }.  sqlit
16340 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
16350 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73  (db, pList);.  s
16360 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
16370 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65  ete(db, pTblName
16380 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
16390 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
163a0 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
163b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
163c0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
163d0 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d   file format num
163e0 62 65 72 20 69 73 20 61 74 20 6c 65 61 73 74 20  ber is at least 
163f0 6d 69 6e 46 6f 72 6d 61 74 2e 0a 2a 2a 20 54 68  minFormat..** Th
16400 65 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65  e generated code
16410 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74   will increase t
16420 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e  he file format n
16430 75 6d 62 65 72 20 69 66 20 6e 65 63 65 73 73 61  umber if necessa
16440 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ry..*/.void sqli
16450 74 65 33 4d 69 6e 69 6d 75 6d 46 69 6c 65 46 6f  te3MinimumFileFo
16460 72 6d 61 74 28 50 61 72 73 65 20 2a 70 50 61 72  rmat(Parse *pPar
16470 73 65 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  se, int iDb, int
16480 20 6d 69 6e 46 6f 72 6d 61 74 29 7b 0a 20 20 56   minFormat){.  V
16490 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71  dbe *v;.  v = sq
164a0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
164b0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
164c0 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71  .    int r1 = sq
164d0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
164e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 6e 74  pParse);.    int
164f0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
16500 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
16510 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20  .    int j1;.   
16520 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16530 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f  p3(v, OP_ReadCoo
16540 6b 69 65 2c 20 69 44 62 2c 20 72 31 2c 20 31 29  kie, iDb, r1, 1)
16550 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16560 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
16570 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
16580 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16590 49 6e 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72 6d  Integer, minForm
165a0 61 74 2c 20 72 32 29 3b 0a 20 20 20 20 6a 31 20  at, r2);.    j1 
165b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
165c0 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c 20 72 32  Op3(v, OP_Ge, r2
165d0 2c 20 30 2c 20 72 31 29 3b 0a 20 20 20 20 73 71  , 0, r1);.    sq
165e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
165f0 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
16600 20 69 44 62 2c 20 31 2c 20 72 32 29 3b 0a 20 20   iDb, 1, r2);.  
16610 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
16620 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
16630 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
16640 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
16650 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
16660 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
16670 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 7d 0a  Parse, r2);.  }.
16680 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68  }../*.** Fill th
16690 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74  e Index.aiRowEst
166a0 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65  [] array with de
166b0 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f  fault informatio
166c0 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  n - information.
166d0 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68  ** to be used wh
166e0 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72  en we have not r
166f0 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63  un the ANALYZE c
16700 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69  ommand..**.** ai
16710 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70  RowEst[0] is sup
16720 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  pose to contain 
16730 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
16740 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  ements in the in
16750 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65  dex..** Since we
16760 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75   do not know, gu
16770 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20  ess 1 million.  
16780 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61  aiRowEst[1] is a
16790 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
167a0 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
167b0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
167c0 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
167d0 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65  particular value
167e0 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   of the.** first
167f0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
16800 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b  ndex.  aiRowEst[
16810 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  2] is an estimat
16820 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a  e of the number.
16830 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  ** of rows that 
16840 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
16850 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f  ular combiniatio
16860 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32  n of the first 2
16870 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74   columns.** of t
16880 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73  he index.  And s
16890 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73  o forth.  It mus
168a0 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  t always be the 
168b0 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20  case that.*.**  
168c0 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
168d0 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e  t[N]<=aiRowEst[N
168e0 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  -1].**          
168f0 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a   aiRowEst[N]>=1.
16900 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d  **.** Apart from
16910 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c   that, we have l
16920 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62  ittle to go on b
16930 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e  esides intuition
16940 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69   as to.** how ai
16950 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20  RowEst[] should 
16960 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
16970 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e   The numbers gen
16980 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61  erated here.** a
16990 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69  re based on typi
169a0 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64  cal values found
169b0 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63   in actual indic
169c0 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
169d0 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
169e0 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
169f0 20 75 6e 73 69 67 6e 65 64 20 2a 61 20 3d 20 70   unsigned *a = p
16a00 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20  Idx->aiRowEst;. 
16a10 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
16a20 28 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d  ( a!=0 );.  a[0]
16a30 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 66 6f   = 1000000;.  fo
16a40 72 28 69 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  r(i=pIdx->nColum
16a50 6e 3b 20 69 3e 3d 35 3b 20 69 2d 2d 29 7b 0a 20  n; i>=5; i--){. 
16a60 20 20 20 61 5b 69 5d 20 3d 20 35 3b 0a 20 20 7d     a[i] = 5;.  }
16a70 0a 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 29  .  while( i>=1 )
16a80 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 31 31 20  {.    a[i] = 11 
16a90 2d 20 69 3b 0a 20 20 20 20 69 2d 2d 3b 0a 20 20  - i;.    i--;.  
16aa0 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e  }.  if( pIdx->on
16ab0 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
16ac0 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43  {.    a[pIdx->nC
16ad0 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a  olumn] = 1;.  }.
16ae0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
16af0 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20  utine will drop 
16b00 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65  an existing name
16b10 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72  d index.  This r
16b20 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d  outine.** implem
16b30 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e  ents the DROP IN
16b40 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  DEX statement..*
16b50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
16b60 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  opIndex(Parse *p
16b70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
16b80 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69  pName, int ifExi
16b90 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  sts){.  Index *p
16ba0 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76  Index;.  Vdbe *v
16bb0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
16bc0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
16bd0 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20  int iDb;..  if( 
16be0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
16bf0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
16c00 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
16c10 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
16c20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  }.  assert( pNam
16c30 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
16c40 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
16c50 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
16c60 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
16c70 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
16c80 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  ndex;.  }.  pInd
16c90 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
16ca0 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d  Index(db, pName-
16cb0 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61  >a[0].zName, pNa
16cc0 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
16cd0 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  se);.  if( pInde
16ce0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  x==0 ){.    if( 
16cf0 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20  !ifExists ){.   
16d00 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
16d10 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
16d20 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20  uch index: %S", 
16d30 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  pName, 0);.    }
16d40 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
16d50 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
16d60 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
16d70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
16d80 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e  ( pIndex->autoIn
16d90 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
16da0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
16db0 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69  e, "index associ
16dc0 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45  ated with UNIQUE
16dd0 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49   ".      "or PRI
16de0 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
16df0 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72  int cannot be dr
16e00 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  opped", 0);.    
16e10 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
16e20 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20  ndex;.  }.  iDb 
16e30 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
16e40 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
16e50 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66  x->pSchema);.#if
16e60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16e70 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
16e80 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20   {.    int code 
16e90 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  = SQLITE_DROP_IN
16ea0 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  DEX;.    Table *
16eb0 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
16ec0 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Table;.    const
16ed0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
16ee0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
16ef0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
16f00 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
16f10 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69  ABLE(iDb);.    i
16f20 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
16f30 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
16f40 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
16f50 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
16f60 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
16f70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
16f80 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
16f90 44 42 20 26 26 20 69 44 62 20 29 20 63 6f 64 65  DB && iDb ) code
16fa0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
16fb0 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
16fc0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
16fd0 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
16fe0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
16ff0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
17000 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
17010 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
17020 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
17030 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
17040 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
17050 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
17060 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
17070 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
17080 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
17090 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
170a0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
170b0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
170c0 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
170d0 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
170e0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
170f0 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
17100 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
17110 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20  name=%Q",.      
17120 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
17130 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
17140 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 70  E(iDb),.       p
17150 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Index->zName.   
17160 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
17170 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
17180 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c   "sqlite_stat1",
17190 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
171a0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ame) ){.      sq
171b0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
171c0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
171d0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
171e0 2e 73 71 6c 69 74 65 5f 73 74 61 74 31 20 57 48  .sqlite_stat1 WH
171f0 45 52 45 20 69 64 78 3d 25 51 22 2c 0a 20 20 20  ERE idx=%Q",.   
17200 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
17210 5d 2e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d  ].zName, pIndex-
17220 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
17230 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
17240 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
17250 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
17260 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
17270 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e  pParse, pIndex->
17280 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
17290 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
172a0 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65  4(v, OP_DropInde
172b0 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49  x, iDb, 0, 0, pI
172c0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
172d0 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
172e0 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33  index:.  sqlite3
172f0 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
17300 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , pName);.}../*.
17310 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61 20 70  ** pArray is a p
17320 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72  ointer to an arr
17330 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
17340 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74  Each object in t
17350 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73  he.** array is s
17360 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20  zEntry bytes in 
17370 73 69 7a 65 2e 20 20 54 68 69 73 20 72 6f 75 74  size.  This rout
17380 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ine allocates a 
17390 6e 65 77 0a 2a 2a 20 6f 62 6a 65 63 74 20 6f 6e  new.** object on
173a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
173b0 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e  array..**.** *pn
173c0 45 6e 74 72 79 20 69 73 20 74 68 65 20 6e 75 6d  Entry is the num
173d0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 61  ber of entries a
173e0 6c 72 65 61 64 79 20 69 6e 20 75 73 65 2e 20 20  lready in use.  
173f0 2a 70 6e 41 6c 6c 6f 63 20 69 73 0a 2a 2a 20 74  *pnAlloc is.** t
17400 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  he previously al
17410 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
17420 74 68 65 20 61 72 72 61 79 2e 20 20 69 6e 69 74  the array.  init
17430 53 69 7a 65 20 69 73 20 74 68 65 0a 2a 2a 20 73  Size is the.** s
17440 75 67 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c  uggested initial
17450 20 61 72 72 61 79 20 73 69 7a 65 20 61 6c 6c 6f   array size allo
17460 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
17470 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
17480 65 77 20 65 6e 74 72 79 20 69 73 20 72 65 74 75  ew entry is retu
17490 72 6e 65 64 20 69 6e 20 2a 70 49 64 78 2e 0a 2a  rned in *pIdx..*
174a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
174b0 65 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  e returns a poin
174c0 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79  ter to the array
174d0 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 54 68   of objects.  Th
174e0 69 73 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 74  is.** might be t
174f0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70  he same as the p
17500 41 72 72 61 79 20 70 61 72 61 6d 65 74 65 72 20  Array parameter 
17510 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  or it might be a
17520 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 70 6f   different.** po
17530 69 6e 74 65 72 20 69 66 20 74 68 65 20 61 72 72  inter if the arr
17540 61 79 20 77 61 73 20 72 65 73 69 7a 65 64 2e 0a  ay was resized..
17550 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
17560 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
17570 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
17580 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
17590 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
175a0 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
175b0 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c  .  void *pArray,
175c0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
175d0 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74   objects.  Might
175e0 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20   be reallocated 
175f0 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79  */.  int szEntry
17600 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  ,      /* Size o
17610 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  f each object in
17620 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20   the array */.  
17630 69 6e 74 20 69 6e 69 74 53 69 7a 65 2c 20 20 20  int initSize,   
17640 20 20 2f 2a 20 53 75 67 67 65 73 74 65 64 20 69    /* Suggested i
17650 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69 6f  nitial allocatio
17660 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a  n, in elements *
17670 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79  /.  int *pnEntry
17680 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
17690 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65  of objects curre
176a0 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20  ntly in use */. 
176b0 20 69 6e 74 20 2a 70 6e 41 6c 6c 6f 63 2c 20 20   int *pnAlloc,  
176c0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
176d0 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ze of the alloca
176e0 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74  tion, in element
176f0 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78  s */.  int *pIdx
17700 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
17710 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  e the index of a
17720 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a   new slot here *
17730 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  /.){.  char *z;.
17740 20 20 69 66 28 20 2a 70 6e 45 6e 74 72 79 20 3e    if( *pnEntry >
17750 3d 20 2a 70 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  = *pnAlloc ){.  
17760 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20    void *pNew;.  
17770 20 20 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20    int newSize;. 
17780 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 28 2a 70     newSize = (*p
17790 6e 41 6c 6c 6f 63 29 2a 32 20 2b 20 69 6e 69 74  nAlloc)*2 + init
177a0 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 20 3d  Size;.    pNew =
177b0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
177c0 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20 6e 65  c(db, pArray, ne
177d0 77 53 69 7a 65 2a 73 7a 45 6e 74 72 79 29 3b 0a  wSize*szEntry);.
177e0 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
177f0 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d  ){.      *pIdx =
17800 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
17810 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a  n pArray;.    }.
17820 20 20 20 20 2a 70 6e 41 6c 6c 6f 63 20 3d 20 73      *pnAlloc = s
17830 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
17840 7a 65 28 64 62 2c 20 70 4e 65 77 29 2f 73 7a 45  ze(db, pNew)/szE
17850 6e 74 72 79 3b 0a 20 20 20 20 70 41 72 72 61 79  ntry;.    pArray
17860 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a   = pNew;.  }.  z
17870 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79   = (char*)pArray
17880 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 2a 70  ;.  memset(&z[*p
17890 6e 45 6e 74 72 79 20 2a 20 73 7a 45 6e 74 72 79  nEntry * szEntry
178a0 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a  ], 0, szEntry);.
178b0 20 20 2a 70 49 64 78 20 3d 20 2a 70 6e 45 6e 74    *pIdx = *pnEnt
178c0 72 79 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79  ry;.  ++*pnEntry
178d0 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61  ;.  return pArra
178e0 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  y;.}../*.** Appe
178f0 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  nd a new element
17900 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64   to the given Id
17910 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
17920 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a  new IdList if.**
17930 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20   need be..**.** 
17940 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20  A new IdList is 
17950 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
17960 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
17970 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a  ils..*/.IdList *
17980 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
17990 65 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  end(sqlite3 *db,
179a0 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20   IdList *pList, 
179b0 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
179c0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
179d0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
179e0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
179f0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
17a00 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b  izeof(IdList) );
17a10 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
17a20 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
17a30 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
17a40 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  = 0;.  }.  pList
17a50 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72  ->a = sqlite3Arr
17a60 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
17a70 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73    db,.      pLis
17a80 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65  t->a,.      size
17a90 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c  of(pList->a[0]),
17aa0 0a 20 20 20 20 20 20 35 2c 0a 20 20 20 20 20 20  .      5,.      
17ab0 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20  &pList->nId,.   
17ac0 20 20 20 26 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f     &pList->nAllo
17ad0 63 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b  c,.      &i.  );
17ae0 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20  .  if( i<0 ){.  
17af0 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
17b00 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
17b10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
17b20 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69    }.  pList->a[i
17b30 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
17b40 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
17b50 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65  b, pToken);.  re
17b60 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
17b70 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49  *.** Delete an I
17b80 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dList..*/.void s
17b90 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
17ba0 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
17bb0 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
17bc0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
17bd0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
17be0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
17bf0 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
17c00 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
17c10 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  ee(db, pList->a[
17c20 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
17c30 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
17c40 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  b, pList->a);.  
17c50 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
17c60 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pList);.}../*.
17c70 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
17c80 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20  dex in pList of 
17c90 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e  the identifier n
17ca0 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72  amed zId.  Retur
17cb0 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66  n -1.** if not f
17cc0 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
17cd0 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
17ce0 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63  IdList *pList, c
17cf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
17d00 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
17d10 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
17d20 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d  urn -1;.  for(i=
17d30 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
17d40 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
17d50 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
17d60 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
17d70 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74   zName)==0 ) ret
17d80 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
17d90 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
17da0 20 45 78 70 61 6e 64 20 74 68 65 20 73 70 61 63   Expand the spac
17db0 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
17dc0 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73  the given SrcLis
17dd0 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63  t object by.** c
17de0 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e  reating nExtra n
17df0 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69  ew slots beginni
17e00 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20 20 69  ng at iStart.  i
17e10 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61  Start is zero ba
17e20 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74  sed..** New slot
17e30 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  s are zeroed..**
17e40 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
17e50 20 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69   suppose a SrcLi
17e60 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e  st initially con
17e70 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65  tains two entrie
17e80 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70  s: A,B..** To ap
17e90 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69  pend 3 new entri
17ea0 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c  es onto the end,
17eb0 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   do this:.**.** 
17ec0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
17ed0 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72  tEnlarge(db, pSr
17ee0 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a  clist, 3, 2);.**
17ef0 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63 61  .** After the ca
17f00 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c  ll above it woul
17f10 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42  d contain:  A, B
17f20 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e  , nil, nil, nil.
17f30 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61 72  .** If the iStar
17f40 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62  t argument had b
17f50 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66  een 1 instead of
17f60 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73   2, then the res
17f70 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76  ult.** would hav
17f80 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c  e been:  A, nil,
17f90 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54   nil, nil, B.  T
17fa0 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65  o prepend the ne
17fb0 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20  w slots,.** the 
17fc0 69 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75  iStart value wou
17fd0 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 72 65  ld be 0.  The re
17fe0 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a  sult then would.
17ff0 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c  ** be: nil, nil,
18000 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a   nil, A, B..**.*
18010 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
18020 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 74  location fails t
18030 68 65 20 53 72 63 4c 69 73 74 20 69 73 20 75 6e  he SrcList is un
18040 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a  changed.  The.**
18050 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
18060 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65 20 73  d flag will be s
18070 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53  et to true..*/.S
18080 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
18090 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20  rcListEnlarge(. 
180a0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
180b0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
180c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  connection to no
180d0 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f  tify of OOM erro
180e0 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  rs */.  SrcList 
180f0 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68  *pSrc,     /* Th
18100 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20  e SrcList to be 
18110 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e  enlarged */.  in
18120 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
18130 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
18140 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74  w slots to add t
18150 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20  o pSrc->a[] */. 
18160 20 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20   int iStart     
18170 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
18180 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72  pSrc->a[] of fir
18190 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29  st new slot */.)
181a0 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
181b0 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
181c0 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61   on calling para
181d0 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65  meters */.  asse
181e0 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b  rt( iStart>=0 );
181f0 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72  .  assert( nExtr
18200 61 3e 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 53  a>=1 );.  if( pS
18210 72 63 3d 3d 30 20 7c 7c 20 69 53 74 61 72 74 3e  rc==0 || iStart>
18220 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  pSrc->nSrc ){.  
18230 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
18240 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
18250 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20    return pSrc;. 
18260 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
18270 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61  e additional spa
18280 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  ce if needed */.
18290 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
182a0 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41  +nExtra>pSrc->nA
182b0 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
182c0 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  ist *pNew;.    i
182d0 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63  nt nAlloc = pSrc
182e0 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20  ->nSrc+nExtra;. 
182f0 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20     int nGot;.   
18300 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
18310 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72  bRealloc(db, pSr
18320 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
18330 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20    sizeof(*pSrc) 
18340 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a  + (nAlloc-1)*siz
18350 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20  eof(pSrc->a[0]) 
18360 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
18370 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
18380 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
18390 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
183a0 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d  turn pSrc;.    }
183b0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77  .    pSrc = pNew
183c0 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71  ;.    nGot = (sq
183d0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
183e0 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69  e(db, pNew) - si
183f0 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a  zeof(*pSrc))/siz
18400 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b  eof(pSrc->a[0])+
18410 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c  1;.    pSrc->nAl
18420 6c 6f 63 20 3d 20 28 75 31 36 29 6e 47 6f 74 3b  loc = (u16)nGot;
18430 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  .  }..  /* Move 
18440 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74  existing slots t
18450 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74  hat come after t
18460 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65  he newly inserte
18470 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74  d slots.  ** out
18480 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20   of the way */. 
18490 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
184a0 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20  c-1; i>=iStart; 
184b0 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i--){.    pSrc->
184c0 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53  a[i+nExtra] = pS
184d0 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  rc->a[i];.  }.  
184e0 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 28 69  pSrc->nSrc += (i
184f0 31 36 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a  16)nExtra;..  /*
18500 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20   Zero the newly 
18510 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20  allocated slots 
18520 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72  */.  memset(&pSr
18530 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  c->a[iStart], 0,
18540 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b   sizeof(pSrc->a[
18550 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66  0])*nExtra);.  f
18560 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69  or(i=iStart; i<i
18570 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b  Start+nExtra; i+
18580 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  +){.    pSrc->a[
18590 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  i].iCursor = -1;
185a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72  .  }..  /* Retur
185b0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
185c0 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c  he enlarged SrcL
185d0 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ist */.  return 
185e0 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pSrc;.}.../*.** 
185f0 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62  Append a new tab
18600 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67  le name to the g
18610 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43  iven SrcList.  C
18620 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c  reate a new SrcL
18630 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
18640 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  e.  A new entry 
18650 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  is created in th
18660 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69  e SrcList even i
18670 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
18680 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73  ..**.** A SrcLis
18690 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
186a0 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  r NULL if there 
186b0 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  is an OOM error.
186c0 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a    The returned.*
186d0 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  * SrcList might 
186e0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
186f0 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
18700 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20  was input or it 
18710 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65  might be.** a ne
18720 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f  w one.  If an OO
18730 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  M error does occ
18740 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72  urs, then the pr
18750 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69  ior value of pLi
18760 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e  st.** that is in
18770 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
18780 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63  ine is automatic
18790 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  ally freed..**.*
187a0 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
187b0 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
187c0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
187d0 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
187e0 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
187f0 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
18800 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
18810 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
18820 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
18830 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
18840 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
18850 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
18860 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
18870 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
18880 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
18890 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
188a0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
188b0 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
188c0 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
188d0 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
188e0 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
188f0 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
18900 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
18910 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
18920 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
18930 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
18940 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
18950 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
18960 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
18970 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
18980 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
18990 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
189a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
189b0 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
189c0 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,0);.**.** Then
189d0 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61   B is a table na
189e0 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  me and the datab
189f0 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70  ase name is unsp
18a00 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c  ecified.  If cal
18a10 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73  led.** like this
18a20 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
18a30 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
18a40 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a  pend(D,A,B,C);.*
18a50 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74  *.** Then C is t
18a60 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
18a70 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62  d B is the datab
18a80 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63  ase name..*/.Src
18a90 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
18aa0 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71  ListAppend(.  sq
18ab0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
18ac0 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
18ad0 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c  to notify of mal
18ae0 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  loc failures */.
18af0 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74    SrcList *pList
18b00 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ,     /* Append 
18b10 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e  to this SrcList.
18b20 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20   NULL creates a 
18b30 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20  new SrcList */. 
18b40 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
18b50 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
18b60 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b   append */.  Tok
18b70 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20  en *pDatabase   
18b80 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20   /* Database of 
18b90 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  the table */.){.
18ba0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
18bb0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
18bc0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
18bd0 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
18be0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
18bf0 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69  db, sizeof(SrcLi
18c00 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
18c10 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
18c20 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
18c30 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20  Alloc = 1;.  }. 
18c40 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
18c50 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
18c60 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69  b, pList, 1, pLi
18c70 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 69 66 28  st->nSrc);.  if(
18c80 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
18c90 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
18ca0 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
18cb0 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65  , pList);.    re
18cc0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 49  turn 0;.  }.  pI
18cd0 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
18ce0 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  pList->nSrc-1];.
18cf0 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
18d00 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d  && pDatabase->z=
18d10 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62  =0 ){.    pDatab
18d20 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ase = 0;.  }.  i
18d30 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
18d40 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f  pTable ){.    To
18d50 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61  ken *pTemp = pDa
18d60 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74  tabase;.    pDat
18d70 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a  abase = pTable;.
18d80 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65      pTable = pTe
18d90 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  mp;.  }.  pItem-
18da0 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
18db0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
18dc0 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74  , pTable);.  pIt
18dd0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
18de0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
18df0 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61  oken(db, pDataba
18e00 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  se);.  return pL
18e10 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  ist;.}../*.** As
18e20 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20  sign VdbeCursor 
18e30 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f  index numbers to
18e40 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
18e50 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64   SrcList.*/.void
18e60 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
18e70 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72  ssignCursors(Par
18e80 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
18e90 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
18ea0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
18eb0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
18ec0 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69  em;.  assert(pLi
18ed0 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  st || pParse->db
18ee0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
18ef0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
18f00 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
18f10 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
18f20 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
18f30 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
18f40 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75    if( pItem->iCu
18f50 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b  rsor>=0 ) break;
18f60 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43  .      pItem->iC
18f70 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
18f80 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
18f90 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
18fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18fb0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
18fc0 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
18fd0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pItem->pSelect->
18fe0 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSrc);.      }. 
18ff0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
19000 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
19010 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75  re SrcList inclu
19020 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62  ding all its sub
19030 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  structure..*/.vo
19040 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
19050 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
19060 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  *db, SrcList *pL
19070 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
19080 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
19090 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
190a0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
190b0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65  turn;.  for(pIte
190c0 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
190d0 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
190e0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
190f0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
19100 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74  (db, pItem->zDat
19110 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  abase);.    sqli
19120 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
19130 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
19140 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19150 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  b, pItem->zAlias
19160 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
19170 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
19180 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c  zIndex);.    sql
19190 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
191a0 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
191b0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
191c0 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
191d0 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
191e0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
191f0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29  (db, pItem->pOn)
19200 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
19210 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
19220 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
19230 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
19240 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
19250 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
19260 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
19270 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61   the parser to a
19280 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  dd a new term to
19290 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61   the.** end of a
192a0 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c   growing FROM cl
192b0 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70  ause.  The "p" p
192c0 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
192d0 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46  part of.** the F
192e0 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20  ROM clause that 
192f0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
19300 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22   constructed.  "
19310 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66  p" is NULL.** if
19320 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
19330 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  st term of the F
19340 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61  ROM clause.  pTa
19350 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
19360 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d  e.** are the nam
19370 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  e of the table a
19380 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  nd database name
19390 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
193a0 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44  ause term..** pD
193b0 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20  atabase is NULL 
193c0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
193d0 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69  name qualifier i
193e0 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a  s missing - the.
193f0 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20  ** usual case.  
19400 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20  If the term has 
19410 61 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41  a alias, then pA
19420 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74  lias points to t
19430 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65  he.** alias toke
19440 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  n.  If the term 
19450 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74  is a subquery, t
19460 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73  hen pSubquery is
19470 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73   the.** SELECT s
19480 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68  tatement that th
19490 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64  e subquery encod
194a0 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20  es.  The pTable 
194b0 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  and.** pDatabase
194c0 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
194d0 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72  NULL for subquer
194e0 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e  ies.  The pOn an
194f0 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61  d pUsing.** para
19500 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63  meters are the c
19510 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e  ontent of the ON
19520 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
19530 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
19540 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77   a new SrcList w
19550 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20  hich encodes is 
19560 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68  the FROM with th
19570 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64  e new.** term ad
19580 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ded..*/.SrcList 
19590 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
195a0 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20  ppendFromTerm(. 
195b0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
195c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
195d0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
195e0 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20   SrcList *p,    
195f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19600 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65  left part of the
19610 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72   FROM clause alr
19620 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54  eady seen */.  T
19630 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
19640 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
19650 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61  f the table to a
19660 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63  dd to the FROM c
19670 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  lause */.  Token
19680 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20   *pDatabase,    
19690 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
196a0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
196b0 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a  ining pTable */.
196c0 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c    Token *pAlias,
196d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
196e0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
196f0 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78   of the AS subex
19700 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65  pression */.  Se
19710 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c  lect *pSubquery,
19720 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75        /* A subqu
19730 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63  ery used in plac
19740 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d  e of a table nam
19750 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e  e */.  Expr *pOn
19760 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
19770 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  * The ON clause 
19780 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49  of a join */.  I
19790 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20  dList *pUsing   
197a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53         /* The US
197b0 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
197c0 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  join */.){.  str
197d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
197e0 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
197f0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
19800 3e 64 62 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  >db;.  p = sqlit
19810 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
19820 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70  db, p, pTable, p
19830 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
19840 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 53 72 63   p==0 || p->nSrc
19850 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
19860 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
19870 20 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74   pOn);.    sqlit
19880 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
19890 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  b, pUsing);.    
198a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
198b0 65 74 65 28 64 62 2c 20 70 53 75 62 71 75 65 72  ete(db, pSubquer
198c0 79 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  y);.    return p
198d0 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
198e0 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d  &p->a[p->nSrc-1]
198f0 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73 20 26  ;.  if( pAlias &
19900 26 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20  & pAlias->n ){. 
19910 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
19920 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
19930 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69  omToken(db, pAli
19940 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  as);.  }.  pItem
19950 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62  ->pSelect = pSub
19960 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e  query;.  pItem->
19970 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74  pOn = pOn;.  pIt
19980 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73  em->pUsing = pUs
19990 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ing;.  return p;
199a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
199b0 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e   INDEXED BY or N
199c0 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
199d0 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65  e to the most re
199e0 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a  cently added .**
199f0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
19a00 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73 73  source-list pass
19a10 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
19a20 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
19a30 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
19a40 74 49 6e 64 65 78 65 64 42 79 28 50 61 72 73 65  tIndexedBy(Parse
19a50 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
19a60 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e  t *p, Token *pIn
19a70 64 65 78 65 64 42 79 29 7b 0a 20 20 69 66 28 20  dexedBy){.  if( 
19a80 70 49 6e 64 65 78 65 64 42 79 20 26 26 20 70 20  pIndexedBy && p 
19a90 26 26 20 70 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a  && p->nSrc>0 ){.
19aa0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
19ab0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
19ac0 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
19ad0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
19ae0 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  Item->notIndexed
19af0 3d 3d 30 20 26 26 20 70 49 74 65 6d 2d 3e 7a 49  ==0 && pItem->zI
19b00 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ndex==0 );.    i
19b10 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e  f( pIndexedBy->n
19b20 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65 64  ==1 && !pIndexed
19b30 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f  By->z ){.      /
19b40 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44  * A "NOT INDEXED
19b50 22 20 63 6c 61 75 73 65 20 77 61 73 20 73 75 70  " clause was sup
19b60 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73 65  plied. See parse
19b70 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  .y .      ** con
19b80 73 74 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f  struct "indexed_
19b90 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73  opt" for details
19ba0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d  . */.      pItem
19bb0 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31  ->notIndexed = 1
19bc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19bd0 20 20 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78     pItem->zIndex
19be0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
19bf0 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
19c00 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b  db, pIndexedBy);
19c10 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
19c20 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e  .** When buildin
19c30 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75  g up a FROM clau
19c40 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  se in the parser
19c50 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  , the join opera
19c60 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61  tor.** is initia
19c70 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20  lly attached to 
19c80 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
19c90 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20  .  But the code 
19ca0 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70  generator.** exp
19cb0 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ects the join op
19cc0 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20  erator to be on 
19cd0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
19ce0 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
19cf0 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a  .** Shifts all j
19d00 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72  oin operators fr
19d10 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
19d20 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46   for an entire F
19d30 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a  ROM.** clause..*
19d40 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75  *.** Example: Su
19d50 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69  ppose the join i
19d60 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
19d70 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e  **           A n
19d80 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
19d90 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  n B.**.** The op
19da0 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72  erator is "natur
19db0 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20  al cross join". 
19dc0 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65   The A and B ope
19dd0 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64  rands are stored
19de0 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61  .** in p->a[0] a
19df0 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70  nd p->a[1], resp
19e00 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70  ectively.  The p
19e10 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20  arser initially 
19e20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70  stores the.** op
19e30 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20  erator with A.  
19e40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69  This routine shi
19e50 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f  fts that operato
19e60 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a  r over to B..*/.
19e70 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
19e80 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65  istShiftJoinType
19e90 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
19ea0 69 66 28 20 70 20 26 26 20 70 2d 3e 61 20 29 7b  if( p && p->a ){
19eb0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
19ec0 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b  for(i=p->nSrc-1;
19ed0 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
19ee0 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79    p->a[i].jointy
19ef0 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a  pe = p->a[i-1].j
19f00 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20  ointype;.    }. 
19f10 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74     p->a[0].joint
19f20 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ype = 0;.  }.}..
19f30 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72  /*.** Begin a tr
19f40 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
19f50 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72  d sqlite3BeginTr
19f60 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
19f70 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70  *pParse, int typ
19f80 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
19f90 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
19fa0 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 50  int i;..  if( pP
19fb0 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
19fc0 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
19fd0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
19fe0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
19ff0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1a000 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1a010 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
1a020 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1a030 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1a040 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
1a050 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
1a060 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
1a070 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1a080 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21  pParse);.  if( !
1a090 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  v ) return;.  if
1a0a0 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52  ( type!=TK_DEFER
1a0b0 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  RED ){.    for(i
1a0c0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
1a0d0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1a0e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a0f0 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
1a100 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43  i, (type==TK_EXC
1a110 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20  LUSIVE)+1);.    
1a120 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
1a130 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20  sBtree(v, i);.  
1a140 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1a150 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a160 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c  P_AutoCommit, 0,
1a170 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0);.}../*.** Co
1a180 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
1a190 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
1a1a0 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  e3CommitTransact
1a1b0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
1a1c0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
1a1d0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
1a1e0 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
1a1f0 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
1a200 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  )==0 || db->aDb[
1a210 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
1a220 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
1a230 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
1a240 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1a250 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
1a260 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1a270 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
1a280 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22  ACTION, "COMMIT"
1a290 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
1a2a0 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
1a2b0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1a2c0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1a2d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a2e0 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1a2f0 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d  it, 1, 0);.  }.}
1a300 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
1a310 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1a320 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
1a330 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f  llbackTransactio
1a340 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
1a350 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1a360 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
1a370 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
1a380 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
1a390 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
1a3a0 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
1a3b0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1a3c0 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
1a3d0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1a3e0 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
1a3f0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1a400 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
1a410 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  TION, "ROLLBACK"
1a420 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
1a430 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
1a440 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1a450 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1a460 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a470 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1a480 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d  it, 1, 1);.  }.}
1a490 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1a4a0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1a4b0 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
1a4c0 65 6e 20 69 74 20 70 61 72 73 65 73 20 61 20 63  en it parses a c
1a4d0 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74 65  ommand to create
1a4e0 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72 20  ,.** release or 
1a4f0 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20  rollback an SQL 
1a500 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76  savepoint. .*/.v
1a510 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76 65 70  oid sqlite3Savep
1a520 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72  oint(Parse *pPar
1a530 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65  se, int op, Toke
1a540 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
1a550 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
1a560 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1a570 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
1a580 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
1a590 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
1a5a0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1a5b0 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66  pParse);.#ifndef
1a5c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1a5d0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73  HORIZATION.    s
1a5e0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1a5f0 20 2a 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49   *az[] = { "BEGI
1a600 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22  N", "RELEASE", "
1a610 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20  ROLLBACK" };.   
1a620 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f   assert( !SAVEPO
1a630 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56  INT_BEGIN && SAV
1a640 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d  EPOINT_RELEASE==
1a650 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  1 && SAVEPOINT_R
1a660 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65  OLLBACK==2 );.#e
1a670 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20  ndif.    if( !v 
1a680 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  || sqlite3AuthCh
1a690 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1a6a0 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a  TE_SAVEPOINT, az
1a6b0 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20  [op], zName, 0) 
1a6c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a6d0 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1a6e0 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
1a6f0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
1a700 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a710 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70  dOp4(v, OP_Savep
1a720 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  oint, op, 0, 0, 
1a730 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49  zName, P4_DYNAMI
1a740 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
1a750 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54   Make sure the T
1a760 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20  EMP database is 
1a770 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62  open and availab
1a780 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74  le for use.  Ret
1a790 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
1a7a0 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65  r of errors.  Le
1a7b0 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ave any error me
1a7c0 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50  ssages in the pP
1a7d0 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
1a7e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  */.int sqlite3Op
1a7f0 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
1a800 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1a810 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1a820 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
1a830 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
1a840 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
1a850 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
1a860 74 20 72 63 3b 0a 20 20 20 20 73 74 61 74 69 63  t rc;.    static
1a870 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
1a880 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51   = .          SQ
1a890 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1a8a0 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ITE |.          
1a8b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1a8c0 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
1a8d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1a8e0 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20  SIVE |.         
1a8f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
1a900 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20  ETEONCLOSE |.   
1a910 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1a920 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20  EN_TEMP_DB;..   
1a930 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1a940 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c  eeFactory(db, 0,
1a950 20 30 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55   0, SQLITE_DEFAU
1a960 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20 66  LT_CACHE_SIZE, f
1a970 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
1a980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a990 20 20 20 20 20 20 20 26 64 62 2d 3e 61 44 62 5b         &db->aDb[
1a9a0 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28  1].pBt);.    if(
1a9b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a9c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1a9d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1a9e0 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
1a9f0 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
1aa00 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
1aa10 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
1aa20 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1aa30 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  s");.      pPars
1aa40 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
1aa50 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1aa60 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 64  }.    assert( (d
1aa70 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1aa80 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 7c 7c  E_InTrans)==0 ||
1aa90 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
1aaa0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
1aab0 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
1aac0 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
1aad0 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65  PagerJournalMode
1aae0 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
1aaf0 65 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  er(db->aDb[1].pB
1ab00 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab20 64 62 2d 3e 64 66 6c 74 4a 6f 75 72 6e 61 6c 4d  db->dfltJournalM
1ab30 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ode);.  }.  retu
1ab40 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
1ab50 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
1ab60 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69  e that will veri
1ab70 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
1ab80 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a  okie and start.*
1ab90 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  * a read-transac
1aba0 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d  tion for all nam
1abb0 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
1abc0 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  s..**.** It is i
1abd0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c  mportant that al
1abe0 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73  l schema cookies
1abf0 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64   be verified and
1ac00 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61   all.** read tra
1ac10 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61  nsactions be sta
1ac20 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74  rted before anyt
1ac30 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e  hing else happen
1ac40 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45  s in.** the VDBE
1ac50 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74   program.  But t
1ac60 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
1ac70 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
1ac80 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f  much other.** co
1ac90 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65  de has been gene
1aca0 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20  rated.  So here 
1acb0 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a  is what we do:.*
1acc0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
1acd0 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
1ace0 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63   is called, we c
1acf0 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74  ode an OP_Goto t
1ad00 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70  hat.** will jump
1ad10 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
1ad20 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1ad30 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65  he program.  The
1ad40 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65  n we.** record e
1ad50 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68  very database th
1ad60 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68  at needs its sch
1ad70 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20  ema verified in 
1ad80 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63  the.** pParse->c
1ad90 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e  ookieMask field.
1ada0 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61    Later, after a
1adb0 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61  ll other code ha
1adc0 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61  s been.** genera
1add0 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ted, the subrout
1ade0 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68  ine that does th
1adf0 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  e cookie verific
1ae00 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74  ations and.** st
1ae10 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  arts the transac
1ae20 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f  tions will be co
1ae30 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47  ded and the OP_G
1ae40 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20  oto P2 value.** 
1ae50 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
1ae60 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75  point to that su
1ae70 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67  broutine.  The g
1ae80 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  eneration of the
1ae90 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  .** cookie verif
1aea0 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69  ication subrouti
1aeb0 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20  ne code happens 
1aec0 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  in sqlite3Finish
1aed0 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20  Coding()..**.** 
1aee0 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f  If iDb<0 then co
1aef0 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f  de the OP_Goto o
1af00 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20  nly - don't set 
1af10 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74  flag to verify t
1af20 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20  he.** schema on 
1af30 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20  any databases.  
1af40 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
1af50 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65   to position the
1af60 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c   OP_Goto.** earl
1af70 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62  y in the code, b
1af80 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66  efore we know if
1af90 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61   any database ta
1afa0 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65  bles will be use
1afb0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1afc0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
1afd0 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
1afe0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
1aff0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
1b000 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73 6b  e *v;.  int mask
1b010 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
1b020 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1b030 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
1b040 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f  turn;  /* This o
1b050 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
1b060 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f 72  here was a prior
1b070 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20 3d   error */.  db =
1b080 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1b090 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  f( pParse->cooki
1b0a0 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  eGoto==0 ){.    
1b0b0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
1b0c0 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  to = sqlite3Vdbe
1b0d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1b0e0 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a  o, 0, 0)+1;.  }.
1b0f0 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a    if( iDb>=0 ){.
1b100 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
1b110 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61  db->nDb );.    a
1b120 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
1b130 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44  Db].pBt!=0 || iD
1b140 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  b==1 );.    asse
1b150 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d  rt( iDb<SQLITE_M
1b160 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b  AX_ATTACHED+2 );
1b170 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69  .    mask = 1<<i
1b180 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61  Db;.    if( (pPa
1b190 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
1b1a0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
1b1b0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
1b1c0 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  ieMask |= mask;.
1b1d0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f        pParse->co
1b1e0 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d  okieValue[iDb] =
1b1f0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
1b200 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f  chema->schema_co
1b210 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20  okie;.      if( 
1b220 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
1b230 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
1b240 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d    sqlite3OpenTem
1b250 70 44 61 74 61 62 61 73 65 28 70 50 61 72 73 65  pDatabase(pParse
1b260 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1b270 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1b280 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
1b290 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66   that prepares f
1b2a0 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72  or doing an oper
1b2b0 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69  ation that.** mi
1b2c0 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
1b2d0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
1b2e0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
1b2f0 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  ts a new transac
1b300 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e  tion if we are n
1b310 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  ot already withi
1b320 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  n.** a transacti
1b330 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  on.  If we are a
1b340 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20  lready within a 
1b350 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
1b360 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  n a checkpoint.*
1b370 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  * is set if the 
1b380 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72  setStatement par
1b390 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20  ameter is true. 
1b3a0 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68   A checkpoint sh
1b3b0 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66  ould.** be set f
1b3c0 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68  or operations th
1b3d0 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64  at might fail (d
1b3e0 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69  ue to a constrai
1b3f0 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  nt) part of.** t
1b400 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61  he way through a
1b410 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65  nd which will ne
1b420 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20  ed to undo some 
1b430 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68  writes without h
1b440 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  aving to.** roll
1b450 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74  back the whole t
1b460 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72  ransaction.  For
1b470 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72   operations wher
1b480 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
1b490 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63  s.** can be chec
1b4a0 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63  ked before any c
1b4b0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
1b4c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
1b4d0 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20   it is never.** 
1b4e0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
1b4f0 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68  o a write and th
1b500 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  e checkpoint sho
1b510 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a  uld not be set..
1b520 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62  **.** Only datab
1b530 61 73 65 20 69 44 62 20 61 6e 64 20 74 68 65 20  ase iDb and the 
1b540 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72  temp database ar
1b550 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20  e made writable 
1b560 62 79 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a  by this call..**
1b570 20 49 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e   If iDb==0, then
1b580 20 74 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65   the main and te
1b590 6d 70 20 64 61 74 61 62 61 73 65 73 20 61 72 65  mp databases are
1b5a0 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20   made writable. 
1b5b0 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74    If.** iDb==1 t
1b5c0 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d  hen only the tem
1b5d0 70 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 61  p database is ma
1b5e0 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66  de writable.  If
1b5f0 20 69 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a   iDb>1 then the.
1b600 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61 75 78  ** specified aux
1b610 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
1b620 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74  and the temp dat
1b630 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77  abase are made w
1b640 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  ritable..*/.void
1b650 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1b660 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
1b670 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
1b680 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74  etStatement, int
1b690 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
1b6a0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1b6b0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1b6c0 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
1b6d0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
1b6e0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
1b6f0 2c 20 69 44 62 29 3b 0a 20 20 70 50 61 72 73 65  , iDb);.  pParse
1b700 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31  ->writeMask |= 1
1b710 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20 73 65 74  <<iDb;.  if( set
1b720 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 50 61  Statement && pPa
1b730 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29  rse->nested==0 )
1b740 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1b750 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 74  eAddOp1(v, OP_St
1b760 61 74 65 6d 65 6e 74 2c 20 69 44 62 29 3b 0a 20  atement, iDb);. 
1b770 20 7d 0a 20 20 69 66 28 20 28 4f 4d 49 54 5f 54   }.  if( (OMIT_T
1b780 45 4d 50 44 42 20 7c 7c 20 69 44 62 21 3d 31 29  EMPDB || iDb!=1)
1b790 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   && pParse->db->
1b7a0 61 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b  aDb[1].pBt!=0 ){
1b7b0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
1b7c0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1b7d0 70 50 61 72 73 65 2c 20 73 65 74 53 74 61 74 65  pParse, setState
1b7e0 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a  ment, 1);.  }.}.
1b7f0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
1b800 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73  see if pIndex us
1b810 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
1b820 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
1b830 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
1b840 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
1b850 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73  false if it does
1b860 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   not..*/.#ifndef
1b870 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
1b880 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20  NDEX.static int 
1b890 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63  collationMatch(c
1b8a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
1b8b0 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29  , Index *pIndex)
1b8c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1b8d0 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e  (i=0; i<pIndex->
1b8e0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
1b8f0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1b900 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
1b910 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 3d  l[i];.    if( z=
1b920 3d 7a 43 6f 6c 6c 20 7c 7c 20 28 7a 20 26 26 20  =zColl || (z && 
1b930 7a 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69  zColl && 0==sqli
1b940 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43  te3StrICmp(z, zC
1b950 6f 6c 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 72  oll)) ){.      r
1b960 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1b970 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1b980 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
1b990 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
1b9a0 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61  ices of pTab tha
1b9b0 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  t use the collat
1b9c0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
1b9d0 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d  ll..** If pColl=
1b9e0 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
1b9f0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
1ba00 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65   pTab..*/.#ifnde
1ba10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
1ba20 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
1ba30 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50  d reindexTable(P
1ba40 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
1ba50 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20  ble *pTab, char 
1ba60 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
1ba70 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ba90 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
1baa0 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
1bab0 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70  ..  for(pIndex=p
1bac0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  Tab->pIndex; pIn
1bad0 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64  dex; pIndex=pInd
1bae0 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ex->pNext){.    
1baf0 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( zColl==0 || 
1bb00 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a  collationMatch(z
1bb10 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b  Coll, pIndex) ){
1bb20 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
1bb30 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
1bb40 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
1bb50 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
1bb60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
1bb70 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1bb80 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
1bb90 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
1bba0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
1bbb0 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
1bbc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
1bbd0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
1bbe0 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
1bbf0 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  s of all tables 
1bc00 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
1bc10 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e   where the.** in
1bc20 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f  dices use the co
1bc30 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1bc40 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c   pColl.  If pCol
1bc50 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
1bc60 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63  ute.** all indic
1bc70 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a  es everywhere..*
1bc80 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1bc90 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
1bca0 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
1bcb0 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65  xDatabases(Parse
1bcc0 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63   *pParse, char c
1bcd0 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
1bce0 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
1bcf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1bd00 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
1bd10 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
1bd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd30 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1bd40 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
1bd50 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
1bd60 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
1bd70 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1bd80 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1bd90 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
1bda0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1bdb0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1bdc0 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f  tables in pDb */
1bdd0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bdf0 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
1be00 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20   database */..  
1be10 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64  for(iDb=0, pDb=d
1be20 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e  b->aDb; iDb<db->
1be30 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b  nDb; iDb++, pDb+
1be40 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
1be50 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  pDb!=0 );.    fo
1be60 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(k=sqliteHashFi
1be70 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  rst(&pDb->pSchem
1be80 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b  a->tblHash);  k;
1be90 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
1bea0 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61  t(k)){.      pTa
1beb0 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69  b = (Table*)sqli
1bec0 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20  teHashData(k);. 
1bed0 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c       reindexTabl
1bee0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
1bef0 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
1bf00 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
1bf10 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1bf20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20  for the REINDEX 
1bf30 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
1bf40 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20        REINDEX   
1bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf60 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a           -- 1.**
1bf70 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1bf80 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20   <collation>    
1bf90 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a             -- 2.
1bfa0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
1bfb0 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
1bfc0 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20  <tablename>  -- 
1bfd0 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  3.**        REIN
1bfe0 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
1bff0 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d  .?<indexname>  -
1c000 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31  - 4.**.** Form 1
1c010 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69   causes all indi
1c020 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63  ces in all attac
1c030 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f  hed databases to
1c040 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20   be rebuilt..** 
1c050 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20  Form 2 rebuilds 
1c060 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
1c070 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61  ll databases tha
1c080 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a  t use the named.
1c090 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ** collating fun
1c0a0 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20  ction.  Forms 3 
1c0b0 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68  and 4 rebuild th
1c0c0 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72  e named index or
1c0d0 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20   all.** indices 
1c0e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1c0f0 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e  the named table.
1c100 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1c110 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
1c120 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e  void sqlite3Rein
1c130 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
1c140 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  e, Token *pName1
1c150 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29  , Token *pName2)
1c160 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
1c170 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1c180 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
1c190 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e  uence to be rein
1c1a0 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a  dexed, or NULL *
1c1b0 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62  /* Name of a tab
1c1e0 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  le or index */. 
1c1f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1c200 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1c210 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
1c220 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  base */.  Table 
1c230 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
1c240 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
1c250 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1c260 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
1c270 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
1c280 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
1c290 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
1c2a0 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  ab */.  int iDb;
1c2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2c0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1c2d0 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
1c2e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1c2f0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1c300 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1c310 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1c320 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d    Token *pObjNam
1c330 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1c340 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
1c350 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62  le or index to b
1c360 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a  e reindexed */..
1c370 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
1c380 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
1c390 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1c3a0 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
1c3b0 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
1c3c0 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
1c3d0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
1c3e0 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
1c3f0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
1c400 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
1c410 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1c420 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65    }..  if( pName
1c430 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e  1==0 || pName1->
1c440 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e  z==0 ){.    rein
1c450 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
1c460 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rse, 0);.    ret
1c470 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  urn;.  }else if(
1c480 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e   pName2==0 || pN
1c490 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  ame2->z==0 ){.  
1c4a0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20    char *zColl;. 
1c4b0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
1c4c0 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c  1->z );.    zCol
1c4d0 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
1c4e0 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
1c4f0 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  >db, pName1);.  
1c500 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72    if( !zColl ) r
1c510 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c  eturn;.    pColl
1c520 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
1c530 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
1c540 29 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 2c 20 30 29  ), zColl, -1, 0)
1c550 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
1c560 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f  ){.      if( zCo
1c570 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ll ){.        re
1c580 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
1c590 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  Parse, zColl);. 
1c5a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
1c5b0 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
1c5c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1c5d0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
1c5e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1c5f0 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, zColl);.  }. 
1c600 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
1c610 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
1c620 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
1c630 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  , &pObjName);.  
1c640 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
1c650 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
1c660 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1c670 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  b, pObjName);.  
1c680 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
1c690 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  n;.  zDb = db->a
1c6a0 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
1c6b0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
1c6c0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20  indTable(db, z, 
1c6d0 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  zDb);.  if( pTab
1c6e0 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54   ){.    reindexT
1c6f0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
1c700 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
1c710 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
1c720 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1c730 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
1c740 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
1c750 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69   z, zDb);.  sqli
1c760 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
1c770 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
1c780 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
1c790 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1c7a0 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
1c7b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66  ;.    sqlite3Ref
1c7c0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1c7d0 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
1c7e0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1c7f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1c800 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
1c810 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
1c820 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69  object to be rei
1c830 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64  ndexed");.}.#end
1c840 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
1c850 20 61 20 64 79 6e 61 6d 69 63 6c 79 20 61 6c 6c   a dynamicly all
1c860 6f 63 61 74 65 64 20 4b 65 79 49 6e 66 6f 20 73  ocated KeyInfo s
1c870 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 61  tructure that ca
1c880 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 77 69 74  n be used.** wit
1c890 68 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72  h OP_OpenRead or
1c8a0 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 74 6f   OP_OpenWrite to
1c8b0 20 61 63 63 65 73 73 20 64 61 74 61 62 61 73 65   access database
1c8c0 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
1c8d0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1c8e0 2c 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  , a pointer to t
1c8f0 68 65 20 6e 65 77 20 73 74 72 75 63 74 75 72 65  he new structure
1c900 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e   is returned. In
1c910 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68   this case.** th
1c920 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1c930 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
1c940 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
1c950 65 28 64 62 2c 20 29 20 6f 6e 20 74 68 65 20 72  e(db, ) on the r
1c960 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e  eturned .** poin
1c970 74 65 72 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ter. If an error
1c980 20 6f 63 63 75 72 73 20 28 6f 75 74 20 6f 66 20   occurs (out of 
1c990 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e  memory or missin
1c9a0 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20  g collation .** 
1c9b0 73 65 71 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20  sequence), NULL 
1c9c0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1c9d0 74 68 65 20 73 74 61 74 65 20 6f 66 20 70 50 61  the state of pPa
1c9e0 72 73 65 20 75 70 64 61 74 65 64 20 74 6f 20 72  rse updated to r
1c9f0 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65 20 65 72  eflect.** the er
1ca00 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ror..*/.KeyInfo 
1ca10 2a 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  *sqlite3IndexKey
1ca20 69 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  info(Parse *pPar
1ca30 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
1ca40 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1ca50 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
1ca60 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79  olumn;.  int nBy
1ca70 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79  tes = sizeof(Key
1ca80 49 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29  Info) + (nCol-1)
1ca90 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
1caa0 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20 73 71 6c 69  ) + nCol;.  sqli
1cab0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1cac0 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  ->db;.  KeyInfo 
1cad0 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f  *pKey = (KeyInfo
1cae0 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
1caf0 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
1cb00 73 29 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20  s);..  if( pKey 
1cb10 29 7b 0a 20 20 20 20 70 4b 65 79 2d 3e 64 62 20  ){.    pKey->db 
1cb20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1cb30 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
1cb40 65 72 20 3d 20 28 75 38 20 2a 29 26 28 70 4b 65  er = (u8 *)&(pKe
1cb50 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b  y->aColl[nCol]);
1cb60 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 70 4b  .    assert( &pK
1cb70 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  ey->aSortOrder[n
1cb80 43 6f 6c 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70  Col]==&(((u8 *)p
1cb90 4b 65 79 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b  Key)[nBytes]) );
1cba0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1cbb0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
1cbc0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20    char *zColl = 
1cbd0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  pIdx->azColl[i];
1cbe0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
1cbf0 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b  Coll );.      pK
1cc00 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73  ey->aColl[i] = s
1cc10 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
1cc20 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
1cc30 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 70 4b  l, -1);.      pK
1cc40 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ey->aSortOrder[i
1cc50 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ] = pIdx->aSortO
1cc60 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  rder[i];.    }. 
1cc70 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20     pKey->nField 
1cc80 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 20 20 7d  = (u16)nCol;.  }
1cc90 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
1cca0 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  nErr ){.    sqli
1ccb0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4b  te3DbFree(db, pK
1ccc0 65 79 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20  ey);.    pKey = 
1ccd0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1cce0 70 4b 65 79 3b 0a 7d 0a                          pKey;.}.