/ Hex Artifact Content
Login

Artifact be2bdaf2a3f6b24ef08dc14b9fd33aa84c689908:


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 32 36 20 32 30 30 39 2f 30 33 2f 32 34  1.526 2009/03/24
02f0: 20 31 35 3a 30 38 3a 31 30 20 64 72 68 20 45 78   15:08:10 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 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1540: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1550: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1560: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1570: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1580: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1590: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
15a0: 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
15b0: 45 5f 44 45 42 55 47 0a 20 20 20 20 46 49 4c 45  E_DEBUG.    FILE
15c0: 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66   *trace = (db->f
15d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
15e0: 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74  beTrace)!=0 ? st
15f0: 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71  dout : 0;.    sq
1600: 6c 69 74 65 33 56 64 62 65 54 72 61 63 65 28 76  lite3VdbeTrace(v
1610: 2c 20 74 72 61 63 65 29 3b 0a 23 65 6e 64 69 66  , trace);.#endif
1620: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1630: 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
1640: 61 63 68 65 3d 3d 30 20 29 3b 20 20 2f 2a 20 44  ache==0 );  /* D
1650: 69 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65  isables and re-e
1660: 6e 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a  nables match */.
1670: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1680: 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72  akeReady(v, pPar
1690: 73 65 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73 65  se->nVar, pParse
16a0: 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->nMem,.        
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2c 20 70   pParse->nTab, p
16d0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b  Parse->explain);
16e0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
16f0: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1700: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
1710: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
1720: 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e  lse if( pParse->
1730: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1740: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
1750: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
1760: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54    }.  pParse->nT
1770: 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ab = 0;.  pParse
1780: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50  ->nMem = 0;.  pP
1790: 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a  arse->nSet = 0;.
17a0: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
17b0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   0;.  pParse->co
17c0: 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  okieMask = 0;.  
17d0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
17e0: 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  to = 0;.}../*.**
17f0: 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20   Run the parser 
1800: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1810: 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69  or recursively i
1820: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72  n order to gener
1830: 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20  ate.** code for 
1840: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
1850: 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65  t given onto the
1860: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72   end of the pPar
1870: 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75  se context.** cu
1880: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
1890: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65  nstruction.  Whe
18a0: 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20  n the parser is 
18b0: 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a  run recursively.
18c0: 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65  ** this way, the
18d0: 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69   final OP_Halt i
18e0: 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61  s not appended a
18f0: 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c  nd other initial
1900: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66  ization.** and f
1910: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70  inalization step
1920: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65  s are omitted be
1930: 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20  cause those are 
1940: 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a  handling by the.
1950: 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72  ** outermost par
1960: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65  ser..**.** Not e
1970: 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73  verything is nes
1980: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63  table.  This fac
1990: 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65  ility is designe
19a0: 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49  d to permit.** I
19b0: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61  NSERT, UPDATE, a
19c0: 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  nd DELETE operat
19d0: 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c  ions against SQL
19e0: 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65  ITE_MASTER.  Use
19f0: 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20  .** care if you 
1a00: 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f  decide to try to
1a10: 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   use this routin
1a20: 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
1a30: 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f   purposes..*/.vo
1a40: 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  id sqlite3Nested
1a50: 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61  Parse(Parse *pPa
1a60: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
1a70: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
1a80: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
1a90: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68  char *zSql;.  ch
1aa0: 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
1ab0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1ac0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64   pParse->db;.# d
1ad0: 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28  efine SAVE_SZ  (
1ae0: 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20  sizeof(Parse) - 
1af0: 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e  offsetof(Parse,n
1b00: 56 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76  Var)).  char sav
1b10: 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a  eBuf[SAVE_SZ];..
1b20: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1b30: 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  rr ) return;.  a
1b40: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1b50: 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20  ested<10 );  /* 
1b60: 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f  Nesting should o
1b70: 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65  nly be of limite
1b80: 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f  d depth */.  va_
1b90: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
1ba0: 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  t);.  zSql = sql
1bb0: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c  ite3VMPrintf(db,
1bc0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
1bd0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
1be0: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
1bf0: 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41    return;   /* A
1c00: 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   malloc must hav
1c10: 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  e failed */.  }.
1c20: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
1c30: 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76  ++;.  memcpy(sav
1c40: 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e  eBuf, &pParse->n
1c50: 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20  Var, SAVE_SZ);. 
1c60: 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d   memset(&pParse-
1c70: 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53  >nVar, 0, SAVE_S
1c80: 5a 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e  Z);.  sqlite3Run
1c90: 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a  Parser(pParse, z
1ca0: 53 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  Sql, &zErrMsg);.
1cb0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1cc0: 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
1cd0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1ce0: 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70  , zSql);.  memcp
1cf0: 79 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  y(&pParse->nVar,
1d00: 20 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53   saveBuf, SAVE_S
1d10: 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65  Z);.  pParse->ne
1d20: 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sted--;.}../*.**
1d30: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
1d40: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
1d50: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
1d60: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
1d70: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
1d80: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
1d90: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
1da0: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
1db0: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
1dc0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
1dd0: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
1de0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
1df0: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
1e00: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
1e10: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
1e20: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
1e30: 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74   the table and t
1e40: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63  he.** first matc
1e50: 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65  hing table is re
1e60: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
1e70: 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63  cking for duplic
1e80: 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  ate table.** nam
1e90: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
1ea0: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
1eb0: 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  s TEMP first, th
1ec0: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
1ed0: 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64  y.** auxiliary d
1ee0: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75  atabases added u
1ef0: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
1f00: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53  command..**.** S
1f10: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c  ee also sqlite3L
1f20: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f  ocateTable()..*/
1f30: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46  .Table *sqlite3F
1f40: 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33  indTable(sqlite3
1f50: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
1f60: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
1f70: 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b  har *zDatabase){
1f80: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b  .  Table *p = 0;
1f90: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
1fa0: 6e 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  nName;.  assert(
1fb0: 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 6e   zName!=0 );.  n
1fc0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
1fd0: 72 6c 65 6e 28 64 62 2c 20 7a 4e 61 6d 65 29 20  rlen(db, zName) 
1fe0: 2b 20 31 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  + 1;.  for(i=OMI
1ff0: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
2000: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
2010: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
2020: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
2030: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2040: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
2050: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20  zDatabase!=0 && 
2060: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2070: 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44  Database, db->aD
2080: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
2090: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20  ntinue;.    p = 
20a0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
20b0: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68  &db->aDb[j].pSch
20c0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  ema->tblHash, zN
20d0: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
20e0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
20f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
2100: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
2110: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
2120: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2130: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
2140: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
2150: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
2160: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
2170: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
2180: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
2190: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
21a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
21b0: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
21c0: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
21d0: 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a    Also leave an.
21e0: 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
21f0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
2200: 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  Msg..**.** The d
2210: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
2220: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
2230: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  nd sqlite3FindTa
2240: 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ble() is that th
2250: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65  is.** routine le
2260: 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  aves an error me
2270: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
2280: 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a  >zErrMsg where.*
2290: 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  * sqlite3FindTab
22a0: 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  le() does not..*
22b0: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
22c0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20 20 50  LocateTable(.  P
22d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
22e0: 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78 74        /* context
22f0: 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65 70   in which to rep
2300: 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ort errors */.  
2310: 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20  int isView,     
2320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2330: 66 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20  f looking for a 
2340: 56 49 45 57 20 72 61 74 68 65 72 20 74 68 61 6e  VIEW rather than
2350: 20 61 20 54 41 42 4c 45 20 2a 2f 0a 20 20 63 6f   a TABLE */.  co
2360: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2370: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2380: 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
2390: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a   looking for */.
23a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
23b0: 62 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65  base     /* Name
23c0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
23d0: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
23e0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
23f0: 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  p;..  /* Read th
2400: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
2410: 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  a. If an error o
2420: 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
2430: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
2440: 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70  ** and code in p
2450: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
2460: 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20   NULL. */.  if( 
2470: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
2480: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
2490: 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
24a0: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  rn 0;.  }..  p =
24b0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
24c0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
24d0: 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20  ame, zDbase);.  
24e0: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
24f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67  const char *zMsg
2500: 20 3d 20 69 73 56 69 65 77 20 3f 20 22 6e 6f 20   = isView ? "no 
2510: 73 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e 6f  such view" : "no
2520: 20 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 20 20   such table";.  
2530: 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a    if( zDbase ){.
2540: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2550: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
2560: 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67 2c  s: %s.%s", zMsg,
2570: 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b   zDbase, zName);
2580: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2590: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
25a0: 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25  g(pParse, "%s: %
25b0: 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29  s", zMsg, zName)
25c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
25d0: 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
25e0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
25f0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n p;.}../*.** Lo
2600: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
2610: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
2620: 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20  t describes .** 
2630: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
2640: 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  ex given the nam
2650: 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a  e of that index.
2660: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ** and the name 
2670: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2680: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2690: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  e index..** Retu
26a0: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
26b0: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
26c0: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
26d0: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
26e0: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
26f0: 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74  e.** table and t
2700: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
2710: 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72  g index is retur
2720: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
2730: 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63  ng.** for duplic
2740: 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  ate index names 
2750: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
2760: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a  earch order is.*
2770: 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  * TEMP first, th
2780: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
2790: 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  y auxiliary data
27a0: 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75  bases added.** u
27b0: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
27c0: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65  command..*/.Inde
27d0: 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  x *sqlite3FindIn
27e0: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
27f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2800: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
2810: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
2820: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
2830: 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c   int nName = sql
2840: 69 74 65 33 53 74 72 6c 65 6e 28 64 62 2c 20 7a  ite3Strlen(db, z
2850: 4e 61 6d 65 29 2b 31 3b 0a 20 20 66 6f 72 28 69  Name)+1;.  for(i
2860: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
2870: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2880: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
2890: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20   ? i^1 : i;  /* 
28a0: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
28b0: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53  re MAIN */.    S
28c0: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
28d0: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68   db->aDb[j].pSch
28e0: 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  ema;.    if( zDb
28f0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
2900: 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b  mp(zDb, db->aDb[
2910: 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74  j].zName) ) cont
2920: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
2930: 28 20 70 53 63 68 65 6d 61 20 7c 7c 20 28 6a 3d  ( pSchema || (j=
2940: 3d 31 20 26 26 20 21 64 62 2d 3e 61 44 62 5b 31  =1 && !db->aDb[1
2950: 5d 2e 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66  ].pBt) );.    if
2960: 28 20 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ( pSchema ){.   
2970: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
2980: 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d  shFind(&pSchema-
2990: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
29a0: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   nName);.    }. 
29b0: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
29c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
29d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
29e0: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
29f0: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
2a00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
2a10: 65 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  eeIndex(Index *p
2a20: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
2a30: 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 64 62   = p->pTable->db
2a40: 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Mem;.  sqlite3Db
2a50: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c  Free(db, p->zCol
2a60: 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Aff);.  sqlite3D
2a70: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
2a80: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
2a90: 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72  e given index fr
2aa0: 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  om the index has
2ab0: 68 20 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65  h table, and fre
2ac0: 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20  e.** its memory 
2ad0: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a  structures..**.*
2ae0: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 72  * The index is r
2af0: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
2b00: 64 61 74 61 62 61 73 65 20 68 61 73 68 20 74 61  database hash ta
2b10: 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69  bles but.** it i
2b20: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66  s not unlinked f
2b30: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68  rom the Table th
2b40: 61 74 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a  at it indexes..*
2b50: 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d  * Unlinking from
2b60: 20 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20   the Table must 
2b70: 62 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63  be done by the c
2b80: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
2b90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2ba0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64  sqlite3DeleteInd
2bb0: 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ex(Index *p){.  
2bc0: 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 63  Index *pOld;.  c
2bd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2be0: 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20   = p->zName;..  
2bf0: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
2c00: 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63  shInsert(&p->pSc
2c10: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a  hema->idxHash, z
2c20: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2c50: 28 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20  (zName)+1, 0);. 
2c60: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30   assert( pOld==0
2c70: 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20   || pOld==p );. 
2c80: 20 66 72 65 65 49 6e 64 65 78 28 70 29 3b 0a 7d   freeIndex(p);.}
2c90: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
2ca0: 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64  index called zId
2cb0: 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66  xName which is f
2cc0: 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61  ound in the data
2cd0: 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c  base iDb,.** unl
2ce0: 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66  ike that index f
2cf0: 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68  rom its Table th
2d00: 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  en remove the in
2d10: 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  dex from.** the 
2d20: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
2d30: 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65   and free all me
2d40: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
2d50: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
2d60: 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f  th the index..*/
2d70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
2d80: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
2d90: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  x(sqlite3 *db, i
2da0: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
2db0: 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20  ar *zIdxName){. 
2dc0: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
2dd0: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61 73    int len;.  Has
2de0: 68 20 2a 70 48 61 73 68 20 3d 20 26 64 62 2d 3e  h *pHash = &db->
2df0: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
2e00: 2d 3e 69 64 78 48 61 73 68 3b 0a 0a 20 20 6c 65  ->idxHash;..  le
2e10: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
2e20: 6e 28 64 62 2c 20 7a 49 64 78 4e 61 6d 65 29 3b  n(db, zIdxName);
2e30: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
2e40: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
2e50: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c  ash, zIdxName, l
2e60: 65 6e 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  en+1, 0);.  if( 
2e70: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66  pIndex ){.    if
2e80: 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ( pIndex->pTable
2e90: 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78  ->pIndex==pIndex
2ea0: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
2eb0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
2ec0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
2ed0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2ee0: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
2ef0: 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d     for(p=pIndex-
2f00: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
2f10: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d   p && p->pNext!=
2f20: 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65  pIndex; p=p->pNe
2f30: 78 74 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20  xt){}.      if( 
2f40: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
2f50: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Index ){.       
2f60: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64   p->pNext = pInd
2f70: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ex->pNext;.     
2f80: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
2f90: 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
2fa0: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
2fb0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
2fc0: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
2fd0: 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65  * Erase all sche
2fe0: 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ma information f
2ff0: 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  rom the in-memor
3000: 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66  y hash tables of
3010: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74  .** a single dat
3020: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
3030: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
3040: 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79  o reclaim memory
3050: 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64  .** before the d
3060: 61 74 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20  atabase closes. 
3070: 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c   It is also call
3080: 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ed during a roll
3090: 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65  back.** if there
30a0: 20 77 65 72 65 20 73 63 68 65 6d 61 20 63 68 61   were schema cha
30b0: 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20  nges during the 
30c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69  transaction or i
30d0: 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f  f a.** schema-co
30e0: 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63  okie mismatch oc
30f0: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  curs..**.** If i
3100: 44 62 3d 3d 30 20 74 68 65 6e 20 72 65 73 65 74  Db==0 then reset
3110: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
3120: 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20  hema tables for 
3130: 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  all database.** 
3140: 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d  files.  If iDb>=
3150: 31 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  1 then reset the
3160: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
3170: 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a   for only the.**
3180: 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64   single file ind
3190: 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  icated..*/.void 
31a0: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
31b0: 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74  rnalSchema(sqlit
31c0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
31d0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
31e0: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
31f0: 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
3200: 0a 0a 20 20 69 66 28 20 69 44 62 3d 3d 30 20 29  ..  if( iDb==0 )
3210: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
3220: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
3230: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b    }.  for(i=iDb;
3240: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
3250: 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
3260: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
3270: 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
3280: 61 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  a ){.      asser
3290: 74 28 69 3d 3d 31 20 7c 7c 20 28 70 44 62 2d 3e  t(i==1 || (pDb->
32a0: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
32b0: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 44  reeHoldsMutex(pD
32c0: 62 2d 3e 70 42 74 29 29 29 3b 0a 20 20 20 20 20  b->pBt)));.     
32d0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 46 72   sqlite3SchemaFr
32e0: 65 65 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29  ee(pDb->pSchema)
32f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3300: 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb>0 ) return;.
3310: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44    }.  assert( iD
3320: 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c  b==0 );.  db->fl
3330: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
3340: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
3350: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
3360: 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eAll(db);..  /* 
3370: 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  If one or more o
3380: 66 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  f the auxiliary 
3390: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68  database files h
33a0: 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a  as been closed,.
33b0: 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65    ** then remove
33c0: 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 61   them from the a
33d0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
33e0: 65 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65  e list.  We take
33f0: 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74   the.  ** opport
3400: 75 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73  unity to do this
3410: 20 68 65 72 65 20 73 69 6e 63 65 20 77 65 20 68   here since we h
3420: 61 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64  ave just deleted
3430: 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a   all of the.  **
3440: 20 73 63 68 65 6d 61 20 68 61 73 68 20 74 61 62   schema hash tab
3450: 6c 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72  les and therefor
3460: 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  e do not have to
3470: 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65   make any change
3480: 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66  s.  ** to any of
3490: 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
34a0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
34b0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
34c0: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
34d0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
34e0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
34f0: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  Bt==0 ){.      i
3500: 66 28 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20  f( pDb->pAux && 
3510: 70 44 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20  pDb->xFreeAux ) 
3520: 70 44 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44  pDb->xFreeAux(pD
3530: 62 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20  b->pAux);.      
3540: 70 44 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20  pDb->pAux = 0;. 
3550: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
3560: 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =j=2; i<db->nDb;
3570: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
3580: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
3590: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
35a0: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a   pDb->pBt==0 ){.
35b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
35c0: 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a 4e 61  ree(db, pDb->zNa
35d0: 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  me);.      pDb->
35e0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
35f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
3600: 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a  .    if( j<i ){.
3610: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d        db->aDb[j]
3620: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20   = db->aDb[i];. 
3630: 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20     }.    j++;.  
3640: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e  }.  memset(&db->
3650: 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e  aDb[j], 0, (db->
3660: 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62  nDb-j)*sizeof(db
3670: 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62  ->aDb[j]));.  db
3680: 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28  ->nDb = j;.  if(
3690: 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64   db->nDb<=2 && d
36a0: 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53  b->aDb!=db->aDbS
36b0: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d  tatic ){.    mem
36c0: 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69  cpy(db->aDbStati
36d0: 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69  c, db->aDb, 2*si
36e0: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29  zeof(db->aDb[0])
36f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
3700: 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62  Free(db, db->aDb
3710: 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d  );.    db->aDb =
3720: 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
3730: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
3740: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
3750: 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69  led when a commi
3760: 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  t occurs..*/.voi
3770: 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49  d sqlite3CommitI
3780: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73  nternalChanges(s
3790: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64  qlite3 *db){.  d
37a0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
37b0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
37c0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  s;.}../*.** Clea
37d0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
37e0: 65 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20  es from a table 
37f0: 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74 61 74  or view..*/.stat
3800: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 52 65  ic void sqliteRe
3810: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54  setColumnNames(T
3820: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
3830: 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e   int i;.  Column
3840: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
3850: 33 20 2a 64 62 20 3d 20 70 54 61 62 6c 65 2d 3e  3 *db = pTable->
3860: 64 62 4d 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  dbMem;.  assert(
3870: 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20   pTable!=0 );.  
3880: 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62  if( (pCol = pTab
3890: 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a  le->aCol)!=0 ){.
38a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
38b0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
38c0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
38d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
38e0: 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  b, pCol->zName);
38f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
3900: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
3910: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
3920: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3930: 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b  b, pCol->zType);
3940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
3950: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
3960: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Coll);.    }.   
3970: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3980: 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29  b, pTable->aCol)
3990: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  ;.  }.  pTable->
39a0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  aCol = 0;.  pTab
39b0: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a  le->nCol = 0;.}.
39c0: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
39d0: 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74  e memory data st
39e0: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
39f0: 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
3a00: 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f  en.** Table.  No
3a10: 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
3a20: 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69  e to disk by thi
3a30: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
3a40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
3a50: 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64  st deletes the d
3a60: 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20  ata structure.  
3a70: 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69  It does not unli
3a80: 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  nk.** the table 
3a90: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66  data structure f
3aa0: 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62  rom the hash tab
3ab0: 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69 74  le.  Nor does it
3ac0: 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65 69   remove.** forei
3ad0: 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65  gn keys from the
3ae0: 20 73 71 6c 69 74 65 2e 61 46 4b 65 79 20 68 61   sqlite.aFKey ha
3af0: 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69  sh table.  But i
3b00: 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a  t does destroy.*
3b10: 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  * memory structu
3b20: 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63  res of the indic
3b30: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
3b40: 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  eys associated w
3b50: 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c  ith .** the tabl
3b60: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
3b70: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 54 61  e3DeleteTable(Ta
3b80: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
3b90: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a  Index *pIndex, *
3ba0: 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70  pNext;.  FKey *p
3bb0: 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79  FKey, *pNextFKey
3bc0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
3bd0: 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ..  if( pTable==
3be0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  0 ) return;.  db
3bf0: 20 3d 20 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d   = pTable->dbMem
3c00: 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64  ;..  /* Do not d
3c10: 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65 20  elete the table 
3c20: 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72 65  until the refere
3c30: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
3c40: 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 70 54 61  s zero. */.  pTa
3c50: 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ble->nRef--;.  i
3c60: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e  f( pTable->nRef>
3c70: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
3c80: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
3c90: 54 61 62 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  Table->nRef==0 )
3ca0: 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  ;..  /* Delete a
3cb0: 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ll indices assoc
3cc0: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
3cd0: 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72  table.  */.  for
3ce0: 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65  (pIndex = pTable
3cf0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ->pIndex; pIndex
3d00: 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b  ; pIndex=pNext){
3d10: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e  .    pNext = pIn
3d20: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
3d30: 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
3d40: 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d  pSchema==pTable-
3d50: 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
3d60: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64  sqlite3DeleteInd
3d70: 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  ex(pIndex);.  }.
3d80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3d90: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
3da0: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
3db0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73   foreign keys as
3dc0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
3dd0: 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b  is table.  The k
3de0: 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  eys.  ** should 
3df0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
3e00: 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  n unlinked from 
3e10: 74 68 65 20 70 53 63 68 65 6d 61 2d 3e 61 46 4b  the pSchema->aFK
3e20: 65 79 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20  ey hash table . 
3e30: 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d   */.  for(pFKey=
3e40: 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70  pTable->pFKey; p
3e50: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78  FKey; pFKey=pNex
3e60: 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78  tFKey){.    pNex
3e70: 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70  tFKey = pFKey->p
3e80: 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73  NextFrom;.    as
3e90: 73 65 72 74 28 20 73 71 6c 69 74 65 33 48 61 73  sert( sqlite3Has
3ea0: 68 46 69 6e 64 28 26 70 54 61 62 6c 65 2d 3e 70  hFind(&pTable->p
3eb0: 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 0a 20  Schema->aFKey,. 
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ed0: 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
3ee0: 3e 7a 54 6f 2c 20 73 71 6c 69 74 65 33 53 74 72  >zTo, sqlite3Str
3ef0: 6c 65 6e 33 30 28 70 46 4b 65 79 2d 3e 7a 54 6f  len30(pFKey->zTo
3f00: 29 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20  )+1)!=pFKey );. 
3f10: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3f20: 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 20 20 7d  (db, pFKey);.  }
3f30: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65  .#endif..  /* De
3f40: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
3f50: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
3f60: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52 65  .  */.  sqliteRe
3f70: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  setColumnNames(p
3f80: 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  Table);.  sqlite
3f90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
3fa0: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
3fb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3fc0: 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29  pTable->zColAff)
3fd0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
3fe0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  tDelete(db, pTab
3ff0: 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 23 69  le->pSelect);.#i
4000: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4010: 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69 74 65  T_CHECK.  sqlite
4020: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4030: 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b  pTable->pCheck);
4040: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
4050: 33 56 74 61 62 43 6c 65 61 72 28 70 54 61 62 6c  3VtabClear(pTabl
4060: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
4070: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ree(db, pTable);
4080: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
4090: 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65   the given table
40a0: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
40b0: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65  ables and the de
40c0: 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  lete the.** tabl
40d0: 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  e structure with
40e0: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
40f0: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
4100: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
4110: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
4120: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
4130: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
4140: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  st char *zTabNam
4150: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
4160: 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46    FKey *pF1, *pF
4170: 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  2;.  Db *pDb;.. 
4180: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
4190: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
41a0: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
41b0: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  b );.  assert( z
41c0: 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e  TabName && zTabN
41d0: 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20  ame[0] );.  pDb 
41e0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
41f0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61  .  p = sqlite3Ha
4200: 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70  shInsert(&pDb->p
4210: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
4220: 20 7a 54 61 62 4e 61 6d 65 2c 0a 20 20 20 20 20   zTabName,.     
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4240: 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e     sqlite3Strlen
4250: 33 30 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 30  30(zTabName)+1,0
4260: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69  );.  if( p ){.#i
4270: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4280: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
4290: 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b    for(pF1=p->pFK
42a0: 65 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31  ey; pF1; pF1=pF1
42b0: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
42c0: 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 71      int nTo = sq
42d0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 46  lite3Strlen30(pF
42e0: 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20  1->zTo) + 1;.   
42f0: 20 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33     pF2 = sqlite3
4300: 48 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 70  HashFind(&pDb->p
4310: 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70  Schema->aFKey, p
4320: 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20  F1->zTo, nTo);. 
4330: 20 20 20 20 20 69 66 28 20 70 46 32 3d 3d 70 46       if( pF2==pF
4340: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
4350: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
4360: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46  pDb->pSchema->aF
4370: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
4380: 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f  To, pF1->pNextTo
4390: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
43a0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
43b0: 46 32 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74  F2 && pF2->pNext
43c0: 54 6f 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70  To!=pF1 ){ pF2=p
43d0: 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20  F2->pNextTo; }. 
43e0: 20 20 20 20 20 20 20 69 66 28 20 70 46 32 20 29         if( pF2 )
43f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 32 2d  {.          pF2-
4400: 3e 70 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e  >pNextTo = pF1->
4410: 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 20  pNextTo;.       
4420: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
4430: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
4440: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70  te3DeleteTable(p
4450: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61  );.  }.  db->fla
4460: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
4470: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
4480: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b  *.** Given a tok
4490: 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72  en, return a str
44a0: 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74  ing that consist
44b0: 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66  s of the text of
44c0: 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77   that.** token w
44d0: 69 74 68 20 61 6e 79 20 71 75 6f 74 61 74 69 6f  ith any quotatio
44e0: 6e 73 20 72 65 6d 6f 76 65 64 2e 20 20 53 70 61  ns removed.  Spa
44f0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
4500: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
4510: 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
4520: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
4530: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
4540: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
4550: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
4560: 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65  **.** Tokens are
4570: 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e   often just poin
4580: 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72  ters into the or
4590: 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20  iginal SQL text 
45a0: 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f  and so.** are no
45b0: 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  t \000 terminate
45c0: 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65  d and are not pe
45d0: 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72  rsistent.  The r
45e0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
45f0: 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e  * is \000 termin
4600: 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73  ated and is pers
4610: 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20  istent..*/.char 
4620: 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d  *sqlite3NameFrom
4630: 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64  Token(sqlite3 *d
4640: 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  b, Token *pName)
4650: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
4660: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
4670: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
4680: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
4690: 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a   (char*)pName->z
46a0: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
46b0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
46c0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zName);.  }else{
46d0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a  .    zName = 0;.
46e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
46f0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  me;.}../*.** Ope
4700: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
4710: 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64  ter table stored
4720: 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d   in database num
4730: 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77  ber iDb for.** w
4740: 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c  riting. The tabl
4750: 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e  e is opened usin
4760: 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76  g cursor 0..*/.v
4770: 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d  oid sqlite3OpenM
4780: 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65  asterTable(Parse
4790: 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *p, int iDb){. 
47a0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
47b0: 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20  e3GetVdbe(p);.  
47c0: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
47d0: 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f  (p, iDb, MASTER_
47e0: 52 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f  ROOT, 1, SCHEMA_
47f0: 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73  TABLE(iDb));.  s
4800: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4810: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
4820: 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  , 0, MASTER_ROOT
4830: 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
4840: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
4850: 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 35 2c 20   -1, (char *)5, 
4860: 50 34 5f 49 4e 54 33 32 29 3b 20 20 2f 2a 20 35  P4_INT32);  /* 5
4870: 20 63 6f 6c 75 6d 6e 20 74 61 62 6c 65 20 2a 2f   column table */
4880: 0a 20 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d  .  if( p->nTab==
4890: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62  0 ){.    p->nTab
48a0: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
48b0: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61  ** Parameter zNa
48c0: 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e  me points to a n
48d0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75  ul-terminated bu
48e0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
48f0: 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
4900: 20 64 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e   database ("main
4910: 22 2c 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65  ", "temp" or the
4920: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61   name of an atta
4930: 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a  ched db). This.*
4940: 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
4950: 6e 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ns the index of 
4960: 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61  the named databa
4970: 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c  se in db->aDb[],
4980: 20 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65   or.** -1 if the
4990: 20 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74   named db cannot
49a0: 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e   be found..*/.in
49b0: 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  t sqlite3FindDbN
49c0: 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ame(sqlite3 *db,
49d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
49e0: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
49f0: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  1;         /* Da
4a00: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
4a10: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
4a20: 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20      Db *pDb;.   
4a30: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
4a40: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
4a50: 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e  .    for(i=(db->
4a60: 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d  nDb-1), pDb=&db-
4a70: 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69  >aDb[i]; i>=0; i
4a80: 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20  --, pDb--){.    
4a90: 20 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d    if( (!OMIT_TEM
4aa0: 50 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26  PDB || i!=1 ) &&
4ab0: 20 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65   n==sqlite3Strle
4ac0: 6e 33 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20  n30(pDb->zName) 
4ad0: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d  && .          0=
4ae0: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
4af0: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  pDb->zName, zNam
4b00: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
4b10: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4b20: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4b30: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  i;.}../*.** The 
4b40: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
4b50: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
4b60: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
4b70: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
4b80: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
4b90: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
4ba0: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
4bb0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
4bc0: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
4bd0: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
4be0: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
4bf0: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
4c00: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
4c10: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
4c20: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71  sqlite3FindDb(sq
4c30: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
4c40: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
4c50: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
4c80: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
4c90: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4cb0: 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61   Name we are sea
4cc0: 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  rching for */.  
4cd0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
4ce0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
4cf0: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73   pName);.  i = s
4d00: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
4d10: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  (db, zName);.  s
4d20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4d30: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
4d40: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
4d50: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
4d60: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
4d70: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
4d80: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
4d90: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
4da0: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
4db0: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
4dc0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
4dd0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
4de0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
4df0: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
4e00: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
4e10: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
4e20: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
4e30: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
4e40: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
4e50: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
4e60: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
4e70: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
4e80: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
4e90: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
4ea0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
4eb0: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
4ec0: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
4ed0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
4ee0: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
4ef0: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
4f00: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
4f10: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
4f20: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
4f30: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
4f40: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
4f50: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
4f60: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
4f70: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
4f80: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
4f90: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
4fa0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
4fb0: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
4fc0: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
4fd0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
4fe0: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
4ff0: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
5000: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
5010: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
5020: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
5030: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
5040: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
5050: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
5060: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
5070: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
5080: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
5090: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
50a0: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
50c0: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
50d0: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
50e0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
50f0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
5100: 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65   pName2 && pName
5110: 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66  2->n>0 ){.    if
5120: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
5130: 29 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ) {.      sqlite
5140: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5150: 2c 20 22 63 6f 72 72 75 70 74 20 64 61 74 61 62  , "corrupt datab
5160: 61 73 65 22 29 3b 0a 20 20 20 20 20 20 70 50 61  ase");.      pPa
5170: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
5180: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
5190: 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c    }.    *pUnqual
51a0: 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69   = pName2;.    i
51b0: 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
51c0: 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  Db(db, pName1);.
51d0: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b      if( iDb<0 ){
51e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
51f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
5200: 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
5210: 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20   %T", pName1);. 
5220: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
5230: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
5240: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n -1;.    }.  }e
5250: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
5260: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30   db->init.iDb==0
5270: 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   || db->init.bus
5280: 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64  y );.    iDb = d
5290: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
52a0: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
52b0: 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e1;.  }.  return
52c0: 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   iDb;.}../*.** T
52d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
52e0: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20  sed to check if 
52f0: 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67  the UTF-8 string
5300: 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61   zName is a lega
5310: 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64  l.** unqualified
5320: 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20   name for a new 
5330: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74  schema object (t
5340: 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65  able, index, vie
5350: 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29  w or.** trigger)
5360: 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20  . All names are 
5370: 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f  legal except tho
5380: 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  se that begin wi
5390: 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  th the string.**
53a0: 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75   "sqlite_" (in u
53b0: 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d  pper, lower or m
53c0: 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73  ixed case). This
53d0: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
53e0: 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20  namespace.** is 
53f0: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
5400: 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ernal use..*/.in
5410: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  t sqlite3CheckOb
5420: 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a  jectName(Parse *
5430: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
5440: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
5450: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
5460: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
5470: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20  se->nested==0 . 
5480: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61           && (pPa
5490: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
54a0: 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68   SQLITE_WriteSch
54b0: 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ema)==0.        
54c0: 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
54d0: 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22  trNICmp(zName, "
54e0: 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a  sqlite_", 7) ){.
54f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5500: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a  Msg(pParse, "obj
5510: 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65  ect name reserve
5520: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
5530: 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  se: %s", zName);
5540: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5550: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
5560: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5570: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
5580: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
5590: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
55a0: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
55b0: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
55c0: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
55d0: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
55e0: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
55f0: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
5600: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
5610: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
5620: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
5630: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5640: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
5650: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
5660: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
5670: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
5680: 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65  e name. The isTe
5690: 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72  mp.** flag is tr
56a0: 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ue if the table 
56b0: 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
56c0: 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   in the auxiliar
56d0: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  y database.** fi
56e0: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
56f0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
5700: 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  se file.  This i
5710: 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63  s normally the c
5720: 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  ase.** when the 
5730: 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f  "TEMP" or "TEMPO
5740: 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63  RARY" keyword oc
5750: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a  curs in between.
5760: 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41  ** CREATE and TA
5770: 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  BLE..**.** The n
5780: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  ew table record 
5790: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  is initialized a
57a0: 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65  nd put in pParse
57b0: 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20  ->pNewTable..** 
57c0: 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43  As more of the C
57d0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
57e0: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c  ement is parsed,
57f0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69   additional acti
5800: 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77  on.** routines w
5810: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ill be called to
5820: 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   add more inform
5830: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65  ation to this re
5840: 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20  cord..** At the 
5850: 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
5860: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
5870: 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e  t, the sqlite3En
5880: 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65  dTable() routine
5890: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  .** is called to
58a0: 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f   complete the co
58b0: 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68  nstruction of th
58c0: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
58d0: 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rd..*/.void sqli
58e0: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20  te3StartTable(. 
58f0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5900: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
5910: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
5920: 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72  pName1,   /* Fir
5930: 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  st part of the n
5940: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5950: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f   or view */.  To
5960: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f  ken *pName2,   /
5970: 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
5980: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
5990: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
59a0: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
59b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
59c0: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74  this is a TEMP t
59d0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
59e0: 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72  View,      /* Tr
59f0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
5a00: 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73  VIEW */.  int is
5a10: 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72  Virtual,   /* Tr
5a20: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
5a30: 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f  VIRTUAL table */
5a40: 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20  .  int noErr    
5a50: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
5a60: 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61  g if table alrea
5a70: 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
5a80: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
5a90: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
5aa0: 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20   0; /* The name 
5ab0: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
5ac0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
5ad0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
5ae0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
5af0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
5b00: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
5b10: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
5b20: 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b  able in */.  Tok
5b30: 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a  en *pName;    /*
5b40: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
5b50: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
5b60: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f  o create */..  /
5b70: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
5b80: 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61  iew name to crea
5b90: 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  te is passed to 
5ba0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
5bb0: 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61   tokens.  ** pNa
5bc0: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
5bd0: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
5be0: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
5bf0: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
5c00: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  le:.  **.  ** CR
5c10: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
5c20: 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a  yy (...);.  ** .
5c30: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
5c40: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
5c50: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
5c60: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
5c70: 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65  hand if.  ** the
5c80: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
5c90: 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  ot fully qualifi
5ca0: 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20  ed, i.e.:.  **. 
5cb0: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
5cc0: 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a   yyy(...);.  **.
5cd0: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
5ce0: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
5cf0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
5d00: 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  "..  **.  ** The
5d10: 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73   call below sets
5d20: 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74   the pName point
5d30: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
5d40: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
5d50: 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29   or.  ** pName2)
5d60: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
5d70: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
5d80: 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72  le name. The var
5d90: 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a  iable iDb is.  *
5da0: 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  * set to the ind
5db0: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
5dc0: 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  se that the tabl
5dd0: 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20  e or view is to 
5de0: 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  be.  ** created 
5df0: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d  in..  */.  iDb =
5e00: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
5e10: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
5e20: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
5e30: 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
5e40: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
5e50: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
5e60: 20 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31   isTemp && iDb>1
5e70: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72   ){.    /* If cr
5e80: 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61  eating a temp ta
5e90: 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61  ble, the name ma
5ea0: 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69  y not be qualifi
5eb0: 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ed */.    sqlite
5ec0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5ed0: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
5ee0: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
5ef0: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
5f00: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
5f10: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
5f20: 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44  B && isTemp ) iD
5f30: 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65  b = 1;..  pParse
5f40: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a  ->sNameToken = *
5f50: 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d  pName;.  zName =
5f60: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
5f70: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
5f80: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
5f90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
5fa0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
5fb0: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
5fc0: 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
5fd0: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
5fe0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5ff0: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69  .  }.  if( db->i
6000: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
6010: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
6020: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
6030: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
6040: 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31  ert( (isTemp & 1
6050: 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b  )==isTemp );.  {
6060: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
6070: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
6080: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
6090: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
60a0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
60b0: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
60c0: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
60d0: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
60e0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
60f0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6100: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6110: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
6120: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
6130: 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20   && isTemp ){.  
6140: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
6150: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
6160: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
6170: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
6180: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
6190: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  VIEW;.      }.  
61a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
61b0: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
61c0: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
61d0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
61e0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
61f0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
6200: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
6210: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
6220: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
6230: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
6240: 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74  Virtual && sqlit
6250: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
6260: 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c  se, code, zName,
6270: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
6280: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
6290: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
62a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
62b0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
62c0: 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f  ew table name do
62d0: 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77  es not collide w
62e0: 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  ith an existing.
62f0: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
6300: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
6310: 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20  same database.  
6320: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
6330: 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69  essage if.  ** i
6340: 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65  t does. The exce
6350: 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20  ption is if the 
6360: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
6370: 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65  parsed was passe
6380: 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c  d.  ** to an sql
6390: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
63a0: 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61  b() call. In tha
63b0: 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20  t case only the 
63c0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a  column names.  *
63d0: 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c  * and types will
63e0: 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65   be used, so the
63f0: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
6400: 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70   test for namesp
6410: 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69  ace.  ** collisi
6420: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
6430: 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42  !IN_DECLARE_VTAB
6440: 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   ){.    if( SQLI
6450: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
6460: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
6470: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
6480: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6490: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
64a0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
64b0: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
64c0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
64d0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ame);.    if( pT
64e0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  able ){.      if
64f0: 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  ( !noErr ){.    
6500: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6510: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
6520: 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78  le %T already ex
6530: 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ists", pName);. 
6540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
6550: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6560: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
6570: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
6580: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  dex(db, zName, 0
6590: 29 21 3d 30 20 26 26 20 28 69 44 62 3d 3d 30 20  )!=0 && (iDb==0 
65a0: 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  || !db->init.bus
65b0: 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  y) ){.      sqli
65c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
65d0: 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
65e0: 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e  ready an index n
65f0: 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
6600: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  ;.      goto beg
6610: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6620: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61      }.  }..  pTa
6630: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ble = sqlite3DbM
6640: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
6650: 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
6660: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b  if( pTable==0 ){
6670: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
6680: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70  ailed = 1;.    p
6690: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
66a0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50  TE_NOMEM;.    pP
66b0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
66c0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
66d0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  le_error;.  }.  
66e0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20  pTable->zName = 
66f0: 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d  zName;.  pTable-
6700: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70  >iPKey = -1;.  p
6710: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d  Table->pSchema =
6720: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
6730: 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d  chema;.  pTable-
6740: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  >nRef = 1;.  pTa
6750: 62 6c 65 2d 3e 64 62 4d 65 6d 20 3d 20 64 62 2d  ble->dbMem = db-
6760: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
6770: 6c 65 64 20 3f 20 64 62 20 3a 20 30 3b 0a 20 20  led ? db : 0;.  
6780: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  if( pParse->pNew
6790: 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33 44  Table ) sqlite3D
67a0: 65 6c 65 74 65 54 61 62 6c 65 28 70 50 61 72 73  eleteTable(pPars
67b0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20  e->pNewTable);. 
67c0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
67d0: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
67e0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
67f0: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
6800: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
6810: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
6820: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
6830: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
6840: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
6850: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
6860: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
6870: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
6880: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
6890: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
68a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
68b0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
68c0: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  NT.  if( !pParse
68d0: 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63  ->nested && strc
68e0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
68f0: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
6900: 29 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70  ){.    pTable->p
6910: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20  Schema->pSeqTab 
6920: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  = pTable;.  }.#e
6930: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ndif..  /* Begin
6940: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
6950: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
6960: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
6970: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
6980: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
6990: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
69a0: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
69b0: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
69c0: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
69d0: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
69e0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
69f0: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
6a00: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
6a10: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
6a20: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
6a30: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
6a40: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
6a50: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
6a60: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
6a70: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
6a80: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
6a90: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
6aa0: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
6ab0: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
6ac0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
6ad0: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
6ae0: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
6af0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
6b00: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20  init.busy && (v 
6b10: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
6b20: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
6b30: 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20 20      int j1;.    
6b40: 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a  int fileFormat;.
6b50: 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65      int reg1, re
6b60: 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 73 71  g2, reg3;.    sq
6b70: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
6b80: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
6b90: 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   0, iDb);..#ifnd
6ba0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
6bb0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
6bc0: 69 66 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b  if( isVirtual ){
6bd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6be0: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56  beAddOp0(v, OP_V
6bf0: 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65  Begin);.    }.#e
6c00: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
6c10: 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  the file format 
6c20: 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20  and encoding in 
6c30: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 76  the database hav
6c40: 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20  e not been set, 
6c50: 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d  .    ** set them
6c60: 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   now..    */.   
6c70: 20 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e   reg1 = pParse->
6c80: 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
6c90: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
6ca0: 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  eg2 = pParse->re
6cb0: 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65  gRoot = ++pParse
6cc0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33  ->nMem;.    reg3
6cd0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
6ce0: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
6cf0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52  beAddOp3(v, OP_R
6d00: 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  eadCookie, iDb, 
6d10: 72 65 67 33 2c 20 31 29 3b 20 20 20 2f 2a 20 66  reg3, 1);   /* f
6d20: 69 6c 65 5f 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ile_format */.  
6d30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
6d40: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
6d50: 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
6d60: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
6d70: 5f 49 66 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  _If, reg3);.    
6d80: 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62  fileFormat = (db
6d90: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
6da0: 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21  _LegacyFileFmt)!
6db0: 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
6dc0: 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54         1 : SQLIT
6dd0: 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41  E_MAX_FILE_FORMA
6de0: 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  T;.    sqlite3Vd
6df0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6e00: 6e 74 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d  nteger, fileForm
6e10: 61 74 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73  at, reg3);.    s
6e20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6e30: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
6e40: 2c 20 69 44 62 2c 20 31 2c 20 72 65 67 33 29 3b  , iDb, 1, reg3);
6e50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6e60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
6e70: 65 67 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72  eger, ENC(db), r
6e80: 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg3);.    sqlite
6e90: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6ea0: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
6eb0: 2c 20 34 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  , 4, reg3);.    
6ec0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
6ed0: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20  ere(v, j1);..   
6ee0: 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72   /* This just cr
6ef0: 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f  eates a place-ho
6f00: 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74  lder record in t
6f10: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
6f20: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54   table..    ** T
6f30: 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65  he record create
6f40: 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  d does not conta
6f50: 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e  in anything yet.
6f60: 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70    It will be rep
6f70: 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  laced.    ** by 
6f80: 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69  the real entry i
6f90: 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  n code generated
6fa0: 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61   at sqlite3EndTa
6fb0: 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ble()..    **.  
6fc0: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
6fd0: 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  or the new entry
6fe0: 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
6ff0: 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67  ster pParse->reg
7000: 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68  Rowid..    ** Th
7010: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
7020: 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  er of the new ta
7030: 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72  ble is left in r
7040: 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  eg pParse->regRo
7050: 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ot..    ** The r
7060: 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61  owid and root pa
7070: 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73  ge number values
7080: 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74   are needed by t
7090: 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20  he code that.   
70a0: 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61   ** sqlite3EndTa
70b0: 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  ble will generat
70c0: 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64  e..    */.#if !d
70d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
70e0: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
70f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7100: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20  _VIRTUALTABLE). 
7110: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c     if( isView ||
7120: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
7130: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7140: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7150: 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20  ger, 0, reg2);. 
7160: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
7170: 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69      {.      sqli
7180: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7190: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c   OP_CreateTable,
71a0: 20 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20 20   iDb, reg2);.   
71b0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
71c0: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50  enMasterTable(pP
71d0: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
71e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
71f0: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
7200: 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  , 0, reg1);.    
7210: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7220: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
7230: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
7240: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7250: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72   OP_Insert, 0, r
7260: 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  eg3, reg1);.    
7270: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7280: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
7290: 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74  PEND);.    sqlit
72a0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
72b0: 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a  OP_Close);.  }..
72c0: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e    /* Normal (non
72d0: 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20  -error) return. 
72e0: 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  */.  return;..  
72f0: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
7300: 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68  ccurs, we jump h
7310: 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62  ere */.begin_tab
7320: 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  le_error:.  sqli
7330: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
7340: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
7350: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61  }../*.** This ma
7360: 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63  cro is used to c
7370: 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e  ompare two strin
7380: 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73  gs in a case-ins
7390: 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e  ensitive manner.
73a0: 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74  .** It is slight
73b0: 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 20 63  ly faster than c
73c0: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74  alling sqlite3St
73d0: 72 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79  rICmp() directly
73e0: 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65  , but.** produce
73f0: 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a  s larger code..*
7400: 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68  *.** WARNING: Th
7410: 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20  is macro is not 
7420: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
7430: 74 68 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d  the strcmp() fam
7440: 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72  ily. It.** retur
7450: 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  ns true if the t
7460: 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20 65  wo strings are e
7470: 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20  qual, otherwise 
7480: 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  false..*/.#defin
7490: 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20  e STRICMP(x, y) 
74a0: 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54  (\.sqlite3UpperT
74b0: 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65  oLower[*(unsigne
74c0: 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20  d char *)(x)]== 
74d0: 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72    \.sqlite3Upper
74e0: 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e  ToLower[*(unsign
74f0: 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20  ed char *)(y)]  
7500: 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53     \.&& sqlite3S
7510: 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29  trICmp((x)+1,(y)
7520: 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20  +1)==0 )../*.** 
7530: 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e  Add a new column
7540: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
7550: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
7560: 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a  nstructed..**.**
7570: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
7580: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  s this routine o
7590: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
75a0: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  umn declaration.
75b0: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
75c0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
75d0: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
75e0: 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64  le() gets called
75f0: 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74  .** first to get
7600: 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20   things going.  
7610: 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  Then this routin
7620: 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
7630: 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  each.** column..
7640: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
7650: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
7660: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
7670: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
7680: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
7690: 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20  ar *z;.  Column 
76a0: 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33  *pCol;.  sqlite3
76b0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
76c0: 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  b;.  if( (p = pP
76d0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
76e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69  ==0 ) return;.#i
76f0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
7700: 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f  UMN.  if( p->nCo
7710: 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  l+1>db->aLimit[S
7720: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
7730: 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MN] ){.    sqlit
7740: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7750: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
7760: 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e  umns on %s", p->
7770: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
7780: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rn;.  }.#endif. 
7790: 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
77a0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
77b0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
77c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
77d0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
77e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53   i++){.    if( S
77f0: 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f  TRICMP(z, p->aCo
7800: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20  l[i].zName) ){. 
7810: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7820: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
7830: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
7840: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
7850: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7860: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
7870: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7880: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c  }.  if( (p->nCol
7890: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
78a0: 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a    Column *aNew;.
78b0: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
78c0: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70  e3DbRealloc(db,p
78d0: 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b  ->aCol,(p->nCol+
78e0: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
78f0: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
7900: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
7910: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7920: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
7930: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
7940: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
7950: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
7960: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
7970: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
7980: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
7990: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
79a0: 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20  ame = z;. .  /* 
79b0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  If there is no t
79c0: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  ype specified, c
79d0: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20  olumns have the 
79e0: 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79  default affinity
79f0: 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66  .  ** 'NONE'. If
7a00: 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65   there is a type
7a10: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
7a20: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
7a30: 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a  nType() will.  *
7a40: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74  * be called next
7a50: 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66   to set pCol->af
7a60: 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79  finity correctly
7a70: 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61  ..  */.  pCol->a
7a80: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
7a90: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  _AFF_NONE;.  p->
7aa0: 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nCol++;.}../*.**
7ab0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
7ac0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
7ad0: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
7ae0: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
7af0: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
7b00: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
7b10: 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  .  A "NOT NULL" 
7b20: 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a  constraint has.*
7b30: 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61  * been seen on a
7b40: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72   column.  This r
7b50: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
7b60: 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a  notNull flag on.
7b70: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75  ** the column cu
7b80: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
7b90: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
7ba0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f  oid sqlite3AddNo
7bb0: 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61  tNull(Parse *pPa
7bc0: 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  rse, int onError
7bd0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
7be0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70   int i;.  if( (p
7bf0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
7c00: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
7c10: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
7c20: 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29  -1;.  if( i>=0 )
7c30: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e   p->aCol[i].notN
7c40: 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ull = (u8)onErro
7c50: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e  r;.}../*.** Scan
7c60: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
7c70: 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e   name zType (len
7c80: 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72  gth nType) and r
7c90: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73  eturn the.** ass
7ca0: 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79  ociated affinity
7cb0: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   type..**.** Thi
7cc0: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61  s routine does a
7cd0: 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e   case-independen
7ce0: 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70  t search of zTyp
7cf0: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75  e for the .** su
7d00: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
7d10: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e  following table.
7d20: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   If one of the s
7d30: 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20  ubstrings is.** 
7d40: 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65  found, the corre
7d50: 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74  sponding affinit
7d60: 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  y is returned. I
7d70: 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73  f zType contains
7d80: 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  .** more than on
7d90: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
7da0: 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77  ngs, entries tow
7db0: 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a  ard the top of .
7dc0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b  ** the table tak
7dd0: 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20  e priority. For 
7de0: 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70  example, if zTyp
7df0: 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20  e is 'BLOBINT', 
7e00: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  .** SQLITE_AFF_I
7e10: 4e 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e  NTEGER is return
7e20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72  ed..**.** Substr
7e30: 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69  ing     | Affini
7e40: 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ty.** ----------
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e60: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20  ------.** 'INT' 
7e70: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7e80: 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20  _AFF_INTEGER.** 
7e90: 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20  'CHAR'        | 
7ea0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
7eb0: 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20  ** 'CLOB'       
7ec0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
7ed0: 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20  XT.** 'TEXT'    
7ee0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7ef0: 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20  _TEXT.** 'BLOB' 
7f00: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7f10: 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41  AFF_NONE.** 'REA
7f20: 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  L'        | SQLI
7f30: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
7f40: 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53  FLOA'        | S
7f50: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
7f60: 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20 20 20  * 'DOUB'        
7f70: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
7f80: 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20  L.**.** If none 
7f90: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
7fa0: 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74  s in the above t
7fb0: 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a  able are found,.
7fc0: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ** SQLITE_AFF_NU
7fd0: 4d 45 52 49 43 20 69 73 20 72 65 74 75 72 6e 65  MERIC is returne
7fe0: 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  d..*/.char sqlit
7ff0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63  e3AffinityType(c
8000: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 79 70  onst Token *pTyp
8010: 65 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b  e){.  u32 h = 0;
8020: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 53 51  .  char aff = SQ
8030: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
8040: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
8050: 65 64 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 70  ed char *zIn = p
8060: 54 79 70 65 2d 3e 7a 3b 0a 20 20 63 6f 6e 73 74  Type->z;.  const
8070: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8080: 7a 45 6e 64 20 3d 20 26 70 54 79 70 65 2d 3e 7a  zEnd = &pType->z
8090: 5b 70 54 79 70 65 2d 3e 6e 5d 3b 0a 0a 20 20 77  [pType->n];..  w
80a0: 68 69 6c 65 28 20 7a 49 6e 21 3d 7a 45 6e 64 20  hile( zIn!=zEnd 
80b0: 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38  ){.    h = (h<<8
80c0: 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72  ) + sqlite3Upper
80d0: 54 6f 4c 6f 77 65 72 5b 2a 7a 49 6e 5d 3b 0a 20  ToLower[*zIn];. 
80e0: 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66     zIn++;.    if
80f0: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
8100: 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('h'<<16)+('a'<<
8110: 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20  8)+'r') ){      
8120: 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a         /* CHAR *
8130: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
8140: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a  LITE_AFF_TEXT; .
8150: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
8160: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('c'<<24)+('l'
8170: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
8180: 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  b') ){       /* 
8190: 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66  CLOB */.      af
81a0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
81b0: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
81c0: 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29  f( h==(('t'<<24)
81d0: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c  +('e'<<16)+('x'<
81e0: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20  <8)+'t') ){     
81f0: 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20    /* TEXT */.   
8200: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8210: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
8220: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27  lse if( h==(('b'
8230: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
8240: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('o'<<8)+'b')   
8250: 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a         /* BLOB *
8260: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66  /.        && (af
8270: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
8280: 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51  MERIC || aff==SQ
8290: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29  LITE_AFF_REAL) )
82a0: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
82b0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23  LITE_AFF_NONE;.#
82c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
82d0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
82e0: 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  T.    }else if( 
82f0: 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27  h==(('r'<<24)+('
8300: 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  e'<<16)+('a'<<8)
8310: 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'l')          /
8320: 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20  * REAL */.      
8330: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
8340: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
8350: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8360: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
8370: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
8380: 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'f'<<24)+('l'<<1
8390: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29  6)+('o'<<8)+'a')
83a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f            /* FLO
83b0: 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  A */.        && 
83c0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
83d0: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
83e0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
83f0: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
8400: 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c  e if( h==(('d'<<
8410: 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27  24)+('o'<<16)+('
8420: 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  u'<<8)+'b')     
8430: 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a       /* DOUB */.
8440: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
8450: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8460: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
8470: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
8480: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  L;.#endif.    }e
8490: 6c 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46  lse if( (h&0x00F
84a0: 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31  FFFFF)==(('i'<<1
84b0: 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29  6)+('n'<<8)+'t')
84c0: 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f   ){    /* INT */
84d0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
84e0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
84f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8500: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
8510: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
8520: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8530: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
8540: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
8550: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
8560: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
8570: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
8580: 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b    The pFirst tok
8590: 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  en is the first.
85a0: 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ** token in the 
85b0: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65  sequence of toke
85c0: 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ns that describe
85d0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
85e0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  .** column curre
85f0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
8600: 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74  ruction.   pLast
8610: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b   is the last tok
8620: 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71  en.** in the seq
8630: 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73  uence.  Use this
8640: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
8650: 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69  construct a stri
8660: 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61  ng.** that conta
8670: 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65  ins the typename
8680: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
8690: 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74  nd store that st
86a0: 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  ring.** in zType
86b0: 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
86c0: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
86d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
86e0: 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20  oken *pType){.  
86f0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
8700: 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  i;.  Column *pCo
8710: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
8720: 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  ;..  if( (p = pP
8730: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
8740: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8750: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
8760: 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
8770: 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e  n;.  pCol = &p->
8780: 61 43 6f 6c 5b 69 5d 3b 0a 20 20 64 62 20 3d 20  aCol[i];.  db = 
8790: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 71  pParse->db;.  sq
87a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
87b0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20  pCol->zType);.  
87c0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71  pCol->zType = sq
87d0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
87e0: 65 6e 28 64 62 2c 20 70 54 79 70 65 29 3b 0a 20  en(db, pType);. 
87f0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
8800: 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
8810: 79 54 79 70 65 28 70 54 79 70 65 29 3b 0a 7d 0a  yType(pType);.}.
8820: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  ./*.** The expre
8830: 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66  ssion is the def
8840: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
8850: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
8860: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a   added column.**
8870: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75   of the table cu
8880: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
8890: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
88a0: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
88b0: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
88c0: 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52   be constant.  R
88d0: 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
88e0: 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  n if this.** is 
88f0: 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a  not the case..**
8900: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8910: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
8920: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
8930: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
8940: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
8950: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
8960: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
8970: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
8980: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
8990: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
89a0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
89b0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
89c0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
89d0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  rse->db;.  if( (
89e0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
89f0: 54 61 62 6c 65 29 21 3d 30 20 29 7b 0a 20 20 20  Table)!=0 ){.   
8a00: 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f   pCol = &(p->aCo
8a10: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20  l[p->nCol-1]);. 
8a20: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45     if( !sqlite3E
8a30: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
8a40: 75 6e 63 74 69 6f 6e 28 70 45 78 70 72 29 20 29  unction(pExpr) )
8a50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8a60: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8a70: 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f  "default value o
8a80: 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73  f column [%s] is
8a90: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a   not constant",.
8aa0: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
8ab0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
8ac0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f  e{.      /* A co
8ad0: 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20 75  py of pExpr is u
8ae0: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
8af0: 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20  he original, as 
8b00: 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20  pExpr contains. 
8b10: 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74       ** tokens t
8b20: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c  hat point to vol
8b30: 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68  atile memory. Th
8b40: 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65 20  e 'span' of the 
8b50: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20  expression.     
8b60: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
8b70: 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65 5f  by pragma table_
8b80: 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  info..      */. 
8b90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8ba0: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
8bb0: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70  >pDflt);.      p
8bc0: 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c  Col->pDflt = sql
8bd0: 69 74 65 33 45 78 70 72 44 75 70 28 0a 20 20 20  ite3ExprDup(.   
8be0: 20 20 20 20 20 20 20 64 62 2c 20 70 45 78 70 72         db, pExpr
8bf0: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
8c00: 7c 45 58 50 52 44 55 50 5f 44 49 53 54 49 4e 43  |EXPRDUP_DISTINC
8c10: 54 53 50 41 4e 0a 20 20 20 20 20 20 29 3b 0a 20  TSPAN.      );. 
8c20: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
8c30: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
8c40: 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
8c50: 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20  * Designate the 
8c60: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20  PRIMARY KEY for 
8c70: 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73  the table.  pLis
8c80: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e  t is a list of n
8c90: 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75  ames .** of colu
8ca0: 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68  mns that form th
8cb0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
8cc0: 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c  If pList is NULL
8cd0: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f  , then the.** mo
8ce0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
8cf0: 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  d column of the 
8d00: 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69  table is the pri
8d10: 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  mary key..**.** 
8d20: 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65  A table can have
8d30: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69   at most one pri
8d40: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68  mary key.  If th
8d50: 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
8d60: 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79  has.** a primary
8d70: 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69   key (and this i
8d80: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69  s the second pri
8d90: 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63  mary key) then c
8da0: 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  reate an.** erro
8db0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
8dc0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f  PRIMARY KEY is o
8dd0: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
8de0: 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65  n whose datatype
8df0: 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20   is INTEGER,.** 
8e00: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79  then we will try
8e10: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c   to use that col
8e20: 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64  umn as the rowid
8e30: 2e 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65  .  Set the Table
8e40: 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20  .iPKey.** field 
8e50: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  of the table und
8e60: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
8e70: 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20  to be the index 
8e80: 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  of the.** INTEGE
8e90: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
8ea0: 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b  lumn.  Table.iPK
8eb0: 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20  ey is set to -1 
8ec0: 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  if there is.** n
8ed0: 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
8ee0: 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Y KEY..**.** If 
8ef0: 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61  the key is not a
8f00: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
8f10: 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61  Y KEY, then crea
8f20: 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69  te a unique.** i
8f30: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79  ndex for the key
8f40: 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63  .  No index is c
8f50: 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47  reated for INTEG
8f60: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e  ER PRIMARY KEYs.
8f70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8f80: 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20  AddPrimaryKey(. 
8f90: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8fa0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
8fb0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
8fc0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20  ist *pList,  /* 
8fd0: 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61  List of field na
8fe0: 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mes to be indexe
8ff0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
9000: 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74  or,      /* What
9010: 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e   to do with a un
9020: 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63  iqueness conflic
9030: 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49  t */.  int autoI
9040: 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  nc,      /* True
9050: 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52   if the AUTOINCR
9060: 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73  EMENT keyword is
9070: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
9080: 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20  t sortOrder     
9090: 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  /* SQLITE_SO_ASC
90a0: 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45   or SQLITE_SO_DE
90b0: 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  SC */.){.  Table
90c0: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
90d0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68  >pNewTable;.  ch
90e0: 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  ar *zType = 0;. 
90f0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20   int iCol = -1, 
9100: 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  i;.  if( pTab==0
9110: 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56   || IN_DECLARE_V
9120: 54 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d 61  TAB ) goto prima
9130: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69  ry_key_exit;.  i
9140: 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  f( pTab->tabFlag
9150: 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72  s & TF_HasPrimar
9160: 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  yKey ){.    sqli
9170: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9180: 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c  se, .      "tabl
9190: 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72  e \"%s\" has mor
91a0: 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61  e than one prima
91b0: 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a  ry key", pTab->z
91c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
91d0: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
91e0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61  ;.  }.  pTab->ta
91f0: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73  bFlags |= TF_Has
9200: 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66  PrimaryKey;.  if
9210: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
9220: 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e    iCol = pTab->n
9230: 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61  Col - 1;.    pTa
9240: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73  b->aCol[iCol].is
9250: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d  PrimKey = 1;.  }
9260: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
9270: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
9280: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  r; i++){.      f
9290: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
92a0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
92b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
92c0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
92d0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
92e0: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e, pTab->aCol[iC
92f0: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ol].zName)==0 ){
9300: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
9310: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9320: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
9330: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
9340: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61  .        pTab->a
9350: 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d  Col[iCol].isPrim
9360: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Key = 1;.      }
9370: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
9380: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20  List->nExpr>1 ) 
9390: 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  iCol = -1;.  }. 
93a0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
93b0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
93c0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70  ){.    zType = p
93d0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
93e0: 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28  zType;.  }.  if(
93f0: 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65   zType && sqlite
9400: 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20  3StrICmp(zType, 
9410: 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20  "INTEGER")==0.  
9420: 20 20 20 20 20 20 26 26 20 73 6f 72 74 4f 72 64        && sortOrd
9430: 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  er==SQLITE_SO_AS
9440: 43 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69  C ){.    pTab->i
9450: 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  PKey = iCol;.   
9460: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d   pTab->keyConf =
9470: 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20   (u8)onError;.  
9480: 20 20 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e    assert( autoIn
9490: 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d  c==0 || autoInc=
94a0: 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  =1 );.    pTab->
94b0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f  tabFlags |= auto
94c0: 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65  Inc*TF_Autoincre
94d0: 6d 65 6e 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ment;.  }else if
94e0: 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66  ( autoInc ){.#if
94f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9500: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
9510: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9520: 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f  sg(pParse, "AUTO
9530: 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c  INCREMENT is onl
9540: 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20  y allowed on an 
9550: 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47 45  ".       "INTEGE
9560: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b  R PRIMARY KEY");
9570: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
9580: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61  .    sqlite3Crea
9590: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
95a0: 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20  0, 0, 0, pList, 
95b0: 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 2c 20 73  onError, 0, 0, s
95c0: 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20  ortOrder, 0);.  
95d0: 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d    pList = 0;.  }
95e0: 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  ..primary_key_ex
95f0: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  it:.  sqlite3Exp
9600: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
9610: 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a  se->db, pList);.
9620: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
9630: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48 45  ** Add a new CHE
9640: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f  CK constraint to
9650: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
9660: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
9670: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
9680: 20 73 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b   sqlite3AddCheck
9690: 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
96a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
96b0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
96c0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43  xt */.  Expr *pC
96d0: 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65  heckExpr  /* The
96e0: 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f   check expressio
96f0: 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  n */.){.  sqlite
9700: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9710: 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
9720: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
9730: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
9740: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
9750: 0a 20 20 69 66 28 20 70 54 61 62 20 26 26 20 21  .  if( pTab && !
9760: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
9770: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 43 48  ){.    /* The CH
9780: 45 43 4b 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  ECK expression m
9790: 75 73 74 20 62 65 20 64 75 70 6c 69 63 61 74 65  ust be duplicate
97a0: 64 20 73 6f 20 74 68 61 74 20 74 6f 6b 65 6e 73  d so that tokens
97b0: 20 72 65 66 65 72 0a 20 20 20 20 2a 2a 20 74 6f   refer.    ** to
97c0: 20 6d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20   malloced space 
97d0: 61 6e 64 20 6e 6f 74 20 74 68 65 20 28 65 70 68  and not the (eph
97e0: 65 6d 65 72 61 6c 29 20 74 65 78 74 20 6f 66 20  emeral) text of 
97f0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
9800: 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
9810: 74 20 2a 2f 0a 20 20 20 20 70 54 61 62 2d 3e 70  t */.    pTab->p
9820: 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
9830: 78 70 72 41 6e 64 28 64 62 2c 20 70 54 61 62 2d  xprAnd(db, pTab-
9840: 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20  >pCheck, .      
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9860: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
9870: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
9880: 43 68 65 63 6b 45 78 70 72 2c 20 30 29 29 3b 0a  CheckExpr, 0));.
9890: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
98a0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
98b0: 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a  b, pCheckExpr);.
98c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
98d0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
98e0: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
98f0: 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20  recently parsed 
9900: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  table column.** 
9910: 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67  to the CollSeq g
9920: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
9930: 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54  lite3AddCollateT
9940: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
9950: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  e, Token *pToken
9960: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
9970: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
9980: 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zColl;          
9990: 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20      /* Dequoted 
99a0: 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f  name of collatio
99b0: 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  n sequence */.  
99c0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
99d0: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
99e0: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
99f0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
9a00: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d  ->nCol-1;.  db =
9a10: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a   pParse->db;.  z
9a20: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  Coll = sqlite3Na
9a30: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
9a40: 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21  pToken);.  if( !
9a50: 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  zColl ) return;.
9a60: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f  .  if( sqlite3Lo
9a70: 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
9a80: 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29  se, zColl, -1) )
9a90: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
9aa0: 78 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69  x;.    p->aCol[i
9ab0: 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b  ].zColl = zColl;
9ac0: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
9ad0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c  e column is decl
9ae0: 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20  ared as "<name> 
9af0: 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c  PRIMARY KEY COLL
9b00: 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20  ATE <type>",.   
9b10: 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65   ** then an inde
9b20: 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  x may have been 
9b30: 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20  created on this 
9b40: 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68  column before th
9b50: 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  e.    ** collati
9b60: 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65  on type was adde
9b70: 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20  d. Correct this 
9b80: 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73  if it is the cas
9b90: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
9ba0: 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78  r(pIdx=p->pIndex
9bb0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
9bc0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
9bd0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
9be0: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
9bf0: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
9c00: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20  olumn[0]==i ){. 
9c10: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
9c20: 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c  oll[0] = p->aCol
9c30: 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [i].zColl;.     
9c40: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
9c50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
9c60: 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
9c70: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
9c80: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
9c90: 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ns the collation
9ca0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61   sequence for da
9cb0: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 65  tabase native te
9cc0: 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69  xt.** encoding i
9cd0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
9ce0: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c   string zName, l
9cf0: 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a  ength nName..**.
9d00: 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
9d10: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ted collation se
9d20: 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76  quence is not av
9d30: 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20  ailable, or not 
9d40: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20  available.** in 
9d50: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74  the database nat
9d60: 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ive encoding, th
9d70: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
9d80: 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ory is invoked t
9d90: 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e  o.** request it.
9da0: 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   If the collatio
9db0: 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e  n factory does n
9dc0: 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 61  ot supply such a
9dd0: 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e   sequence,.** an
9de0: 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 69  d the sequence i
9df0: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  s available in a
9e00: 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f  nother text enco
9e10: 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20  ding, then that 
9e20: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  is.** returned i
9e30: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
9e40: 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   no versions of 
9e50: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
9e60: 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63  llations sequenc
9e70: 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c  e are available,
9e80: 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65   or.** another e
9e90: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
9ea0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
9eb0: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
9ec0: 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  ge written into.
9ed0: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a  ** pParse..**.**
9ee0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
9ef0: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
9f00: 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  d sqlite3FindCol
9f10: 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f  lSeq().  This ro
9f20: 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73  utine.** invokes
9f30: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
9f40: 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61  actory if the na
9f50: 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61  med collation ca
9f60: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a  nnot be found.**
9f70: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61   and generates a
9f80: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  n error message.
9f90: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
9fa0: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
9fb0: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
9fc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
9fd0: 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a  me, int nName){.
9fe0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9ff0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38  pParse->db;.  u8
a000: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
a010: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20    u8 initbusy = 
a020: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
a030: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
a040: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
a050: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
a060: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e  b, enc, zName, n
a070: 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b  Name, initbusy);
a080: 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79  .  if( !initbusy
a090: 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21   && (!pColl || !
a0a0: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a  pColl->xCmp) ){.
a0b0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
a0c0: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64 62  te3GetCollSeq(db
a0d0: 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 2c 20  , pColl, zName, 
a0e0: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  nName);.    if( 
a0f0: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
a100: 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 7b 0a 20  if( nName<0 ){. 
a110: 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73         nName = s
a120: 71 6c 69 74 65 33 53 74 72 6c 65 6e 28 64 62 2c  qlite3Strlen(db,
a130: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
a140: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
a150: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
a160: 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f  no such collatio
a170: 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73  n sequence: %.*s
a180: 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  ", nName, zName)
a190: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
a1a0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
a1b0: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
a1c0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
a1d0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
a1e0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63  increment the sc
a1f0: 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a  hema cookie..**.
a200: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f  ** The schema co
a210: 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20  okie is used to 
a220: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74  determine when t
a230: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
a240: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
a250: 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61  anges.  After ea
a260: 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ch schema change
a270: 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  , the cookie val
a280: 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  ue.** changes.  
a290: 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66  When a process f
a2a0: 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73  irst reads the s
a2b0: 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73  chema it records
a2c0: 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20   the.** cookie. 
a2d0: 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65   Thereafter, whe
a2e0: 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f  never it goes to
a2f0: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
a300: 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63  base,.** it chec
a310: 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  ks the cookie to
a320: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
a330: 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68  chema has not ch
a340: 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69  anged.** since i
a350: 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e  t was last read.
a360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e  .**.** This plan
a370: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   is not complete
a380: 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e  ly bullet-proof.
a390: 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
a3a0: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65   for.** the sche
a3b0: 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c  ma to change mul
a3c0: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20  tiple times and 
a3d0: 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  for the cookie t
a3e0: 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b  o be.** set back
a3f0: 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e   to prior value.
a400: 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61    But schema cha
a410: 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75  nges are infrequ
a420: 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70  ent.** and the p
a430: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69  robability of hi
a440: 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  tting the same c
a450: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f  ookie value is o
a460: 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20  nly.** 1 chance 
a470: 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27  in 2^32.  So we'
a480: 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a  re safe enough..
a490: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
a4a0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73  hangeCookie(Pars
a4b0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
a4c0: 44 62 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20  Db){.  int r1 = 
a4d0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
a4e0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
a4f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
a500: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
a510: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
a520: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
a530: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
a540: 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  ger, db->aDb[iDb
a550: 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ].pSchema->schem
a560: 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72 31 29 3b  a_cookie+1, r1);
a570: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
a580: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
a590: 6f 6b 69 65 2c 20 69 44 62 2c 20 30 2c 20 72 31  okie, iDb, 0, r1
a5a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
a5b0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
a5c0: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
a5d0: 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d   Measure the num
a5e0: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
a5f0: 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70  s needed to outp
a600: 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  ut the given.** 
a610: 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65  identifier.  The
a620: 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
a630: 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75   includes any qu
a640: 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74  otes used.** but
a650: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
a660: 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69  e the null termi
a670: 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nator..**.** The
a680: 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e   estimate is con
a690: 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d  servative.  It m
a6a0: 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
a6b0: 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72  hat what is.** r
a6c0: 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f  eally needed..*/
a6d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e  .static int iden
a6e0: 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68  tLength(const ch
a6f0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b  ar *z){.  int n;
a700: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20  .  for(n=0; *z; 
a710: 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69  n++, z++){.    i
a720: 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b  f( *z=='"' ){ n+
a730: 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72  +; }.  }.  retur
a740: 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  n n + 2;.}../*.*
a750: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
a760: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
a770: 75 6e 64 20 73 71 6c 69 74 65 33 47 65 74 54 6f  und sqlite3GetTo
a780: 6b 65 6e 28 29 20 75 73 65 64 20 62 79 20 0a 2a  ken() used by .*
a790: 2a 20 69 73 56 61 6c 69 64 44 69 6d 65 6e 73 69  * isValidDimensi
a7a0: 6f 6e 28 29 2e 20 54 68 69 73 20 66 75 6e 63 74  on(). This funct
a7b0: 69 6f 6e 20 64 69 66 66 65 72 73 20 66 72 6f 6d  ion differs from
a7c0: 20 73 71 6c 69 74 65 33 47 65 74 54 6f 6b 65 6e   sqlite3GetToken
a7d0: 28 29 20 69 6e 0a 2a 2a 20 74 68 61 74 3a 0a 2a  () in.** that:.*
a7e0: 2a 0a 2a 2a 20 20 20 2a 20 57 68 69 74 65 73 70  *.**   * Whitesp
a7f0: 61 63 65 20 69 73 20 69 67 6e 6f 72 65 64 2c 20  ace is ignored, 
a800: 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6f  and.**   * The o
a810: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a  utput variable *
a820: 70 65 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74  peToken is set t
a830: 6f 20 30 20 69 66 20 74 68 65 20 65 6e 64 20 6f  o 0 if the end o
a840: 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 6e 75 6c  f the.**     nul
a850: 2d 74 65 72 6d 69 6e 61 74 65 64 20 69 6e 70 75  -terminated inpu
a860: 74 20 73 74 72 69 6e 67 20 69 73 20 72 65 61 63  t string is reac
a870: 68 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hed..*/.static i
a880: 6e 74 20 67 65 74 54 6f 6b 65 6e 4e 6f 53 70 61  nt getTokenNoSpa
a890: 63 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ce(unsigned char
a8a0: 20 2a 7a 2c 20 69 6e 74 20 2a 70 65 54 6f 6b 65   *z, int *peToke
a8b0: 6e 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  n){.  int n = 0;
a8c0: 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65  .  while( sqlite
a8d0: 33 49 73 73 70 61 63 65 28 7a 5b 6e 5d 29 20 29  3Isspace(z[n]) )
a8e0: 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 21 7a 5b 6e   n++;.  if( !z[n
a8f0: 5d 20 29 7b 0a 20 20 20 20 2a 70 65 54 6f 6b 65  ] ){.    *peToke
a900: 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  n = 0;.    retur
a910: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
a920: 6e 20 6e 20 2b 20 73 71 6c 69 74 65 33 47 65 74  n n + sqlite3Get
a930: 54 6f 6b 65 6e 28 26 7a 5b 6e 5d 2c 20 70 65 54  Token(&z[n], peT
a940: 6f 6b 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oken);.}../*.** 
a950: 50 61 72 61 6d 65 74 65 72 20 7a 20 70 6f 69 6e  Parameter z poin
a960: 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d  ts to a nul-term
a970: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20 52  inated string. R
a980: 65 74 75 72 6e 20 74 72 75 65 20 69 66 2c 20 77  eturn true if, w
a990: 68 65 6e 0a 2a 2a 20 77 68 69 74 65 73 70 61 63  hen.** whitespac
a9a0: 65 20 69 73 20 69 67 6e 6f 72 65 64 2c 20 74 68  e is ignored, th
a9b0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
a9c0: 69 73 20 73 74 72 69 6e 67 20 6d 61 74 63 68 65  is string matche
a9d0: 73 20 6f 6e 65 20 6f 66 20 0a 2a 2a 20 74 68 65  s one of .** the
a9e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 74 74 65   following patte
a9f0: 72 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22  rns:.**.**     "
aa00: 22 0a 2a 2a 20 20 20 20 20 22 28 6e 75 6d 62 65  ".**     "(numbe
aa10: 72 29 22 0a 2a 2a 20 20 20 20 20 22 28 6e 75 6d  r)".**     "(num
aa20: 62 65 72 2c 6e 75 6d 62 65 72 29 22 0a 2a 2f 0a  ber,number)".*/.
aa30: 73 74 61 74 69 63 20 69 6e 74 20 69 73 56 61 6c  static int isVal
aa40: 69 64 44 69 6d 65 6e 73 69 6f 6e 28 75 6e 73 69  idDimension(unsi
aa50: 67 6e 65 64 20 63 68 61 72 20 2a 7a 29 7b 0a 20  gned char *z){. 
aa60: 20 69 6e 74 20 65 54 6f 6b 65 6e 3b 0a 20 20 69   int eToken;.  i
aa70: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 20 2b 3d  nt n = 0;.  n +=
aa80: 20 67 65 74 54 6f 6b 65 6e 4e 6f 53 70 61 63 65   getTokenNoSpace
aa90: 28 26 7a 5b 6e 5d 2c 20 26 65 54 6f 6b 65 6e 29  (&z[n], &eToken)
aaa0: 3b 0a 20 20 69 66 28 20 65 54 6f 6b 65 6e 20 29  ;.  if( eToken )
aab0: 7b 0a 20 20 20 20 69 66 28 20 65 54 6f 6b 65 6e  {.    if( eToken
aac0: 21 3d 54 4b 5f 4c 50 20 29 20 72 65 74 75 72 6e  !=TK_LP ) return
aad0: 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   0;.    n += get
aae0: 54 6f 6b 65 6e 4e 6f 53 70 61 63 65 28 26 7a 5b  TokenNoSpace(&z[
aaf0: 6e 5d 2c 20 26 65 54 6f 6b 65 6e 29 3b 0a 20 20  n], &eToken);.  
ab00: 20 20 69 66 28 20 65 54 6f 6b 65 6e 3d 3d 54 4b    if( eToken==TK
ab10: 5f 50 4c 55 53 20 7c 7c 20 65 54 6f 6b 65 6e 3d  _PLUS || eToken=
ab20: 3d 54 4b 5f 4d 49 4e 55 53 20 29 7b 0a 20 20 20  =TK_MINUS ){.   
ab30: 20 20 20 6e 20 2b 3d 20 67 65 74 54 6f 6b 65 6e     n += getToken
ab40: 4e 6f 53 70 61 63 65 28 26 7a 5b 6e 5d 2c 20 26  NoSpace(&z[n], &
ab50: 65 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20  eToken);.    }. 
ab60: 20 20 20 69 66 28 20 65 54 6f 6b 65 6e 21 3d 54     if( eToken!=T
ab70: 4b 5f 49 4e 54 45 47 45 52 20 26 26 20 65 54 6f  K_INTEGER && eTo
ab80: 6b 65 6e 21 3d 54 4b 5f 46 4c 4f 41 54 20 29 20  ken!=TK_FLOAT ) 
ab90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 6e 20  return 0;.    n 
aba0: 2b 3d 20 67 65 74 54 6f 6b 65 6e 4e 6f 53 70 61  += getTokenNoSpa
abb0: 63 65 28 26 7a 5b 6e 5d 2c 20 26 65 54 6f 6b 65  ce(&z[n], &eToke
abc0: 6e 29 3b 0a 20 20 20 20 69 66 28 20 65 54 6f 6b  n);.    if( eTok
abd0: 65 6e 3d 3d 54 4b 5f 43 4f 4d 4d 41 20 29 7b 0a  en==TK_COMMA ){.
abe0: 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 54 6f        n += getTo
abf0: 6b 65 6e 4e 6f 53 70 61 63 65 28 26 7a 5b 6e 5d  kenNoSpace(&z[n]
ac00: 2c 20 26 65 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  , &eToken);.    
ac10: 20 20 69 66 28 20 65 54 6f 6b 65 6e 3d 3d 54 4b    if( eToken==TK
ac20: 5f 50 4c 55 53 20 7c 7c 20 65 54 6f 6b 65 6e 3d  _PLUS || eToken=
ac30: 3d 54 4b 5f 4d 49 4e 55 53 20 29 7b 0a 20 20 20  =TK_MINUS ){.   
ac40: 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 54 6f 6b       n += getTok
ac50: 65 6e 4e 6f 53 70 61 63 65 28 26 7a 5b 6e 5d 2c  enNoSpace(&z[n],
ac60: 20 26 65 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20   &eToken);.     
ac70: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 54 6f   }.      if( eTo
ac80: 6b 65 6e 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20  ken!=TK_INTEGER 
ac90: 26 26 20 65 54 6f 6b 65 6e 21 3d 54 4b 5f 46 4c  && eToken!=TK_FL
aca0: 4f 41 54 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  OAT ) return 0;.
acb0: 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 54 6f        n += getTo
acc0: 6b 65 6e 4e 6f 53 70 61 63 65 28 26 7a 5b 6e 5d  kenNoSpace(&z[n]
acd0: 2c 20 26 65 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  , &eToken);.    
ace0: 7d 0a 20 20 20 20 69 66 28 20 65 54 6f 6b 65 6e  }.    if( eToken
acf0: 21 3d 54 4b 5f 52 50 20 29 20 72 65 74 75 72 6e  !=TK_RP ) return
ad00: 20 30 3b 0a 20 20 20 20 67 65 74 54 6f 6b 65 6e   0;.    getToken
ad10: 4e 6f 53 70 61 63 65 28 26 7a 5b 6e 5d 2c 20 26  NoSpace(&z[n], &
ad20: 65 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 69  eToken);.  }.  i
ad30: 66 28 20 65 54 6f 6b 65 6e 20 29 20 72 65 74 75  f( eToken ) retu
ad40: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31  rn 0;.  return 1
ad50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
ad60: 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 69  irst parameter i
ad70: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
ad80: 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  n output buffer.
ad90: 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   The second .** 
ada0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
adb0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74  ointer to an int
adc0: 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69  eger that contai
add0: 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  ns the offset at
ade0: 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69  .** which to wri
adf0: 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  te into the outp
ae00: 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73 20  ut buffer. This 
ae10: 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20  function copies 
ae20: 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  the.** nul-termi
ae30: 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69  nated string poi
ae40: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 74  nted to by the t
ae50: 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20  hird parameter, 
ae60: 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a  zSignedIdent,.**
ae70: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
ae80: 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  d offset in the 
ae90: 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61 74  buffer and updat
aea0: 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65  es *pIdx to refe
aeb0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  r.** to the firs
aec0: 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65  t byte after the
aed0: 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74   last byte writt
aee0: 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  en before return
aef0: 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ing..** .** If t
af00: 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65  he string zSigne
af10: 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20  dIdent consists 
af20: 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68  entirely of alph
af30: 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61  a-numeric.** cha
af40: 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f  racters, does no
af50: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 64  t begin with a d
af60: 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20  igit and is not 
af70: 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a  an SQL keyword,.
af80: 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  ** then it is co
af90: 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  pied to the outp
afa0: 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74 6c  ut buffer exactl
afb0: 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65  y as it is. Othe
afc0: 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20  rwise,.** it is 
afd0: 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75  quoted using dou
afe0: 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73  ble-quotes..*/.s
aff0: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
b000: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
b010: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53   *pIdx, char *zS
b020: 69 67 6e 65 64 49 64 65 6e 74 2c 20 69 6e 74 20  ignedIdent, int 
b030: 69 73 54 79 70 65 6e 61 6d 65 29 7b 0a 20 20 75  isTypename){.  u
b040: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
b050: 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  dent = (unsigned
b060: 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64   char*)zSignedId
b070: 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ent;.  int i, j,
b080: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
b090: 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28  = *pIdx;..  for(
b0a0: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
b0b0: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  j++){.    if( !s
b0c0: 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49  qlite3Isalnum(zI
b0d0: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
b0e0: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
b0f0: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
b100: 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64  ote = sqlite3Isd
b110: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 20  igit(zIdent[0]) 
b120: 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  || sqlite3Keywor
b130: 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29  dCode(zIdent, j)
b140: 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 21  !=TK_ID;.  if( !
b150: 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a 20 20 20  needQuote ){.   
b160: 20 69 66 28 20 69 73 54 79 70 65 6e 61 6d 65 20   if( isTypename 
b170: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
b180: 68 69 73 20 69 73 20 61 20 74 79 70 65 2d 6e 61  his is a type-na
b190: 6d 65 2c 20 61 6c 6c 6f 77 20 61 20 6c 69 74 74  me, allow a litt
b1a0: 6c 65 20 6d 6f 72 65 20 66 6c 65 78 69 62 69 6c  le more flexibil
b1b0: 69 74 79 2e 20 49 6e 20 53 51 4c 69 74 65 2c 0a  ity. In SQLite,.
b1c0: 20 20 20 20 20 20 2a 2a 20 61 20 74 79 70 65 2d        ** a type-
b1d0: 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
b1e0: 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
b1f0: 20 20 20 20 20 2a 2a 20 20 20 69 64 73 20 5b 69       **   ids [i
b200: 64 73 5d 20 5b 28 6e 75 6d 62 65 72 20 5b 2c 20  ds] [(number [, 
b210: 6e 75 6d 62 65 72 5d 29 5d 0a 20 20 20 20 20 20  number])].      
b220: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 72  **.      ** wher
b230: 65 20 22 69 64 73 22 20 69 73 20 65 69 74 68 65  e "ids" is eithe
b240: 72 20 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e  r a quoted strin
b250: 67 20 6f 72 20 61 20 73 69 6d 70 6c 65 20 69 64  g or a simple id
b260: 65 6e 74 69 66 69 65 72 20 28 69 6e 20 74 68 65  entifier (in the
b270: 0a 20 20 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  .      ** above 
b280: 6e 6f 74 61 74 69 6f 6e 2c 20 5b 5d 20 6d 65 61  notation, [] mea
b290: 6e 73 20 6f 70 74 69 6f 6e 61 6c 29 2e 20 49 74  ns optional). It
b2a0: 20 69 73 20 61 20 62 69 74 20 74 72 69 63 6b 79   is a bit tricky
b2b0: 20 74 6f 20 63 68 65 63 6b 0a 20 20 20 20 20 20   to check.      
b2c0: 2a 2a 20 66 6f 72 20 61 6c 6c 20 63 61 73 65 73  ** for all cases
b2d0: 2c 20 62 75 74 20 69 74 20 69 73 20 67 6f 6f 64  , but it is good
b2e0: 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65   to avoid unnece
b2f0: 73 73 61 72 69 6c 79 20 71 75 6f 74 69 6e 67 20  ssarily quoting 
b300: 63 6f 6d 6d 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  common.      ** 
b310: 74 79 70 65 6e 61 6d 65 73 20 6c 69 6b 65 20 56  typenames like V
b320: 41 52 43 48 41 52 28 31 30 29 2e 0a 20 20 20 20  ARCHAR(10)..    
b330: 20 20 2a 2f 0a 20 20 20 20 20 20 6e 65 65 64 51    */.      needQ
b340: 75 6f 74 65 20 3d 20 21 69 73 56 61 6c 69 64 44  uote = !isValidD
b350: 69 6d 65 6e 73 69 6f 6e 28 26 7a 49 64 65 6e 74  imension(&zIdent
b360: 5b 6a 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [j]);.    }else{
b370: 0a 20 20 20 20 20 20 6e 65 65 64 51 75 6f 74 65  .      needQuote
b380: 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20   = zIdent[j];.  
b390: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e    }.  }..  if( n
b3a0: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
b3b0: 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a  ] = '"';.  for(j
b3c0: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
b3d0: 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20  ++){.    z[i++] 
b3e0: 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20  = zIdent[j];.   
b3f0: 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d   if( zIdent[j]==
b400: 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  '"' ) z[i++] = '
b410: 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65  "';.  }.  if( ne
b420: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
b430: 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d   = '"';.  z[i] =
b440: 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b   0;.  *pIdx = i;
b450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
b460: 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  te a CREATE TABL
b470: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72  E statement appr
b480: 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
b490: 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20  given.** table. 
b4a0: 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20   Memory to hold 
b4b0: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
b4c0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74  statement is obt
b4d0: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
b4e0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
b4f0: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
b500: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
b510: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
b520: 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61  c char *createTa
b530: 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20  bleStmt(sqlite3 
b540: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a  *db, Table *p){.
b550: 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20    int i, k, n;. 
b560: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
b570: 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65  char *zSep, *zSe
b580: 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20  p2, *zEnd, *z;. 
b590: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
b5a0: 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   n = 0;.  for(pC
b5b0: 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d  ol = p->aCol, i=
b5c0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
b5d0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
b5e0: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
b5f0: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
b600: 20 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79     z = pCol->zTy
b610: 70 65 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b  pe;.    if( z ){
b620: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e  .      n += iden
b630: 74 4c 65 6e 67 74 68 28 7a 29 3b 0a 20 20 20 20  tLength(z);.    
b640: 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65  }.  }.  n += ide
b650: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d  ntLength(p->zNam
b660: 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29  e);.  if( n<50 )
b670: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b  {.    zSep = "";
b680: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22  .    zSep2 = ","
b690: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22  ;.    zEnd = ")"
b6a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
b6b0: 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20  Sep = "\n  ";.  
b6c0: 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20    zSep2 = ",\n  
b6d0: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c  ";.    zEnd = "\
b6e0: 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  n)";.  }.  n += 
b6f0: 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a  35 + 6*p->nCol;.
b700: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
b710: 33 4d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20  3Malloc( n );.  
b720: 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( zStmt==0 ){.
b730: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
b740: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65  iled = 1;.    re
b750: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
b760: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
b770: 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45  , zStmt, "CREATE
b780: 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d   TABLE ");.  k =
b790: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
b7a0: 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74  (zStmt);.  ident
b7b0: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
b7c0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7a  ->zName, 0);.  z
b7d0: 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b  Stmt[k++] = '(';
b7e0: 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61  .  for(pCol=p->a
b7f0: 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e  Col, i=0; i<p->n
b800: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
b810: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
b820: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
b830: 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20  tmt[k], zSep);. 
b840: 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53     k += sqlite3S
b850: 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b  trlen30(&zStmt[k
b860: 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a  ]);.    zSep = z
b870: 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50  Sep2;.    identP
b880: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43  ut(zStmt, &k, pC
b890: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ol->zName, 0);. 
b8a0: 20 20 20 69 66 28 20 28 7a 20 3d 20 70 43 6f 6c     if( (z = pCol
b8b0: 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a 20  ->zType)!=0 ){. 
b8c0: 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20       zStmt[k++] 
b8d0: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 61 73 73  = ' ';.      ass
b8e0: 65 72 74 28 20 28 69 6e 74 29 28 73 71 6c 69 74  ert( (int)(sqlit
b8f0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 6b 2b  e3Strlen30(z)+k+
b900: 31 29 3c 3d 6e 20 29 3b 0a 20 20 20 20 20 20 69  1)<=n );.      i
b910: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
b920: 6b 2c 20 7a 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  k, z, 1);.    }.
b930: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
b940: 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74  printf(n-k, &zSt
b950: 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e  mt[k], "%s", zEn
b960: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74  d);.  return zSt
b970: 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  mt;.}../*.** Thi
b980: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
b990: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
b9a0: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
b9b0: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
b9c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
b9d0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
b9e0: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
b9f0: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
ba00: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
ba10: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
ba20: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
ba30: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
ba40: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
ba50: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
ba60: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
ba70: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
ba80: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
ba90: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
baa0: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
bab0: 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20   unless.** this 
bac0: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
bad0: 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74  able or db->init
bae0: 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20  .busy==1.  When 
baf0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
bb00: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
bb10: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
bb20: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
bb30: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
bb40: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
bb50: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
bb60: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
bb70: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
bb80: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
bb90: 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20  tly changed, so 
bba0: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
bbb0: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
bbc0: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
bbd0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
bbe0: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
bbf0: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
bc00: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
bc10: 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
bc20: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
bc30: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
bc40: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
bc50: 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
bc60: 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
bc70: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
bc80: 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
bc90: 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
bca0: 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
bcb0: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
bcc0: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
bcd0: 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
bce0: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
bcf0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
bd00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
bd10: 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73  EndTable(.  Pars
bd20: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
bd30: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
bd40: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
bd50: 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20  *pCons,         
bd60: 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b    /* The ',' tok
bd70: 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  en after the las
bd80: 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a  t column defn. *
bd90: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
bdb0: 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b  he final ')' tok
bdc0: 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  en in the CREATE
bdd0: 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65   TABLE */.  Sele
bde0: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
bdf0: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72      /* Select fr
be00: 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e  om a "CREATE ...
be10: 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29   AS SELECT" */.)
be20: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
be30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
be40: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
be50: 69 44 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e  iDb;..  if( (pEn
be60: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
be70: 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  =0) || pParse->n
be80: 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
be90: 63 46 61 69 6c 65 64 20 29 20 7b 0a 20 20 20 20  cFailed ) {.    
bea0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20  return;.  }.  p 
beb0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
bec0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
bed0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
bee0: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
bef0: 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20  usy || !pSelect 
bf00: 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  );..  iDb = sqli
bf10: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
bf20: 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
bf30: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
bf40: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f  E_OMIT_CHECK.  /
bf50: 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20  * Resolve names 
bf60: 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e  in all CHECK con
bf70: 73 74 72 61 69 6e 74 20 65 78 70 72 65 73 73 69  straint expressi
bf80: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
bf90: 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20  p->pCheck ){.   
bfa0: 20 53 72 63 4c 69 73 74 20 73 53 72 63 3b 20 20   SrcList sSrc;  
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfc0: 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69 73 74   /* Fake SrcList
bfd0: 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65   for pParse->pNe
bfe0: 77 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4e 61  wTable */.    Na
bff0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c010: 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
c020: 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  r pParse->pNewTa
c030: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73  ble */..    mems
c040: 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
c050: 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 6d 65  of(sNC));.    me
c060: 6d 73 65 74 28 26 73 53 72 63 2c 20 30 2c 20 73  mset(&sSrc, 0, s
c070: 69 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a 20 20  izeof(sSrc));.  
c080: 20 20 73 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b    sSrc.nSrc = 1;
c090: 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a  .    sSrc.a[0].z
c0a0: 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b  Name = p->zName;
c0b0: 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70  .    sSrc.a[0].p
c0c0: 54 61 62 20 3d 20 70 3b 0a 20 20 20 20 73 53 72  Tab = p;.    sSr
c0d0: 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d  c.a[0].iCursor =
c0e0: 20 2d 31 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61   -1;.    sNC.pPa
c0f0: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
c100: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
c110: 20 26 73 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e   &sSrc;.    sNC.
c120: 69 73 43 68 65 63 6b 20 3d 20 31 3b 0a 20 20 20  isCheck = 1;.   
c130: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
c140: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e  lveExprNames(&sN
c150: 43 2c 20 70 2d 3e 70 43 68 65 63 6b 29 20 29 7b  C, p->pCheck) ){
c160: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
c170: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
c180: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
c190: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a  TE_OMIT_CHECK) *
c1a0: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  /..  /* If the d
c1b0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
c1c0: 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  1 it means we ar
c1d0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51  e reading the SQ
c1e0: 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22  L off the.  ** "
c1f0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f  sqlite_master" o
c200: 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  r "sqlite_temp_m
c210: 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20  aster" table on 
c220: 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53  the disk..  ** S
c230: 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  o do not write t
c240: 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e  o the disk again
c250: 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72  .  Extract the r
c260: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  oot page number.
c270: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62    ** for the tab
c280: 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e  le from the db->
c290: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65  init.newTnum fie
c2a0: 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e  ld.  (The page n
c2b0: 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c  umber.  ** shoul
c2c0: 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20  d have been put 
c2d0: 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c  there by the sql
c2e0: 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e  iteOpenCb routin
c2f0: 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  e.).  */.  if( d
c300: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
c310: 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62      p->tnum = db
c320: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a  ->init.newTnum;.
c330: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74    }..  /* If not
c340: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74   initializing, t
c350: 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63  hen create a rec
c360: 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ord for the new 
c370: 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68  table.  ** in th
c380: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
c390: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74  table of the dat
c3a0: 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  abase..  **.  **
c3b0: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45   If this is a TE
c3c0: 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77  MPORARY table, w
c3d0: 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69  rite the entry i
c3e0: 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72  nto the auxiliar
c3f0: 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74  y.  ** file inst
c400: 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20  ead of into the 
c410: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
c420: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  le..  */.  if( !
c430: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
c440: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
c450: 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
c460: 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20  r *zType;    /* 
c470: 22 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65  "view" or "table
c480: 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  " */.    char *z
c490: 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45  Type2;   /* "VIE
c4a0: 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f  W" or "TABLE" */
c4b0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  .    char *zStmt
c4c0: 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20  ;    /* Text of 
c4d0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
c4e0: 20 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20   or CREATE VIEW 
c4f0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20  statement */..  
c500: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
c510: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
c520: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
c530: 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  urn;..    sqlite
c540: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c550: 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20  P_Close, 0);..  
c560: 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69    /* .    ** Ini
c570: 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f  tialize zType fo
c580: 72 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f  r the new view o
c590: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  r table..    */.
c5a0: 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65      if( p->pSele
c5b0: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ct==0 ){.      /
c5c0: 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c  * A regular tabl
c5d0: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  e */.      zType
c5e0: 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20   = "table";.    
c5f0: 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c    zType2 = "TABL
c600: 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  E";.#ifndef SQLI
c610: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20  TE_OMIT_VIEW.   
c620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
c630: 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   A view */.     
c640: 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b   zType = "view";
c650: 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
c660: 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20  "VIEW";.#endif. 
c670: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
c680: 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45  this is a CREATE
c690: 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c   TABLE xx AS SEL
c6a0: 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65  ECT ..., execute
c6b0: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
c6c0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ** statement to 
c6d0: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77  populate the new
c6e0: 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74   table. The root
c6f0: 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72  -page number for
c700: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20   the.    ** new 
c710: 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69  table is in regi
c720: 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67  ster pParse->reg
c730: 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  Root..    **.   
c740: 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c   ** Once the SEL
c750: 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64  ECT has been cod
c760: 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c  ed by sqlite3Sel
c770: 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20  ect(), it is in 
c780: 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c  a.    ** suitabl
c790: 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79  e state to query
c7a0: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
c7b0: 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20  names and types 
c7c0: 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a  to be used.    *
c7d0: 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62  * by the new tab
c7e0: 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
c7f0: 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65  * A shared-cache
c800: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e   write-lock is n
c810: 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77  ot required to w
c820: 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20  rite to the new 
c830: 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73  table,.    ** as
c840: 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d   a schema-lock m
c850: 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
c860: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74   been obtained t
c870: 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e  o create it. Sin
c880: 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65  ce.    ** a sche
c890: 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73  ma-lock excludes
c8a0: 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62   all other datab
c8b0: 61 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77  ase users, the w
c8c0: 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a  rite-lock would.
c8d0: 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64      ** be redund
c8e0: 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ant..    */.    
c8f0: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
c900: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
c910: 64 65 73 74 3b 0a 20 20 20 20 20 20 54 61 62 6c  dest;.      Tabl
c920: 65 20 2a 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20  e *pSelTab;..   
c930: 20 20 20 61 73 73 65 72 74 28 70 50 61 72 73 65     assert(pParse
c940: 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20  ->nTab==1);.    
c950: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c960: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op3(v, OP_OpenWr
c970: 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e  ite, 1, pParse->
c980: 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20  regRoot, iDb);. 
c990: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c9a0: 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a  ChangeP5(v, 1);.
c9b0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
c9c0: 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71  ab = 2;.      sq
c9d0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
c9e0: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 54  nit(&dest, SRT_T
c9f0: 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  able, 1);.      
ca00: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
ca10: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26  arse, pSelect, &
ca20: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
ca30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
ca40: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a  , OP_Close, 1);.
ca50: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
ca60: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
ca70: 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73       pSelTab = s
ca80: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
ca90: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
caa0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
cab0: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
cac0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
cad0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
cae0: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ol==0 );.       
caf0: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54   p->nCol = pSelT
cb00: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
cb10: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c    p->aCol = pSel
cb20: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
cb30: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
cb40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53   = 0;.        pS
cb50: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
cb60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cb70: 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c  DeleteTable(pSel
cb80: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
cb90: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
cba0: 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
cbb0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
cbc0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
cbd0: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
cbe0: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   ){.      zStmt 
cbf0: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
cc00: 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65  t(db, p);.    }e
cc10: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 28  lse{.      n = (
cc20: 69 6e 74 29 28 70 45 6e 64 2d 3e 7a 20 2d 20 70  int)(pEnd->z - p
cc30: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
cc40: 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  n.z) + 1;.      
cc50: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
cc60: 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20  Printf(db, .    
cc70: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73        "CREATE %s
cc80: 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20   %.*s", zType2, 
cc90: 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  n, pParse->sName
cca0: 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b  Token.z.      );
ccb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
ccc0: 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65   slot for the re
ccd0: 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79  cord has already
cce0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
ccf0: 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53  in the .    ** S
cd00: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
cd10: 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65  le.  We just nee
cd20: 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74  d to update that
cd30: 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20   slot with all. 
cd40: 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d     ** the inform
cd50: 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c  ation we've coll
cd60: 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ected..    */.  
cd70: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
cd80: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
cd90: 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
cda0: 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54   ".         "SET
cdb0: 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65   type='%s', name
cdc0: 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  =%Q, tbl_name=%Q
cdd0: 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20  , rootpage=#%d, 
cde0: 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20  sql=%Q ".       
cdf0: 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64  "WHERE rowid=#%d
ce00: 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ",.      db->aDb
ce10: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
ce20: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
ce30: 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20        zType,.   
ce40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
ce50: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
ce60: 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f     pParse->regRo
ce70: 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c  ot,.      zStmt,
ce80: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
ce90: 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20  egRowid.    );. 
cea0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
ceb0: 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20  (db, zStmt);.   
cec0: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
ced0: 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
cee0: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
cef0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
cf00: 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65  EMENT.    /* Che
cf10: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
cf20: 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  need to create a
cf30: 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  n sqlite_sequenc
cf40: 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20  e table for.    
cf50: 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b  ** keeping track
cf60: 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   of autoincremen
cf70: 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20  t keys..    */. 
cf80: 20 20 20 69 66 28 20 70 2d 3e 74 61 62 46 6c 61     if( p->tabFla
cf90: 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
cfa0: 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 44  ement ){.      D
cfb0: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
cfc0: 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 69 66  b[iDb];.      if
cfd0: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
cfe0: 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20  pSeqTab==0 ){.  
cff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
d000: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
d010: 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
d020: 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69  TE TABLE %Q.sqli
d030: 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65  te_sequence(name
d040: 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20  ,seq)",.        
d050: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20    pDb->zName.   
d060: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
d070: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
d080: 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65    /* Reparse eve
d090: 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74  rything to updat
d0a0: 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64  e our internal d
d0b0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a  ata structures *
d0c0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
d0d0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61  eAddOp4(v, OP_Pa
d0e0: 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
d0f0: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71  0, 0,.        sq
d100: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
d110: 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22   "tbl_name='%q'"
d120: 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44  ,p->zName), P4_D
d130: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20  YNAMIC);.  }... 
d140: 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c   /* Add the tabl
d150: 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e to the in-memo
d160: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
d170: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
d180: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  e..  */.  if( db
d190: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
d1a0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
d1b0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
d1c0: 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b  d;.    FKey *pFK
d1d0: 65 79 3b 20 0a 20 20 20 20 53 63 68 65 6d 61 20  ey; .    Schema 
d1e0: 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53  *pSchema = p->pS
d1f0: 63 68 65 6d 61 3b 0a 20 20 20 20 70 4f 6c 64 20  chema;.    pOld 
d200: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
d210: 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  ert(&pSchema->tb
d220: 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
d230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
d250: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d  lite3Strlen30(p-
d260: 3e 7a 4e 61 6d 65 29 2b 31 2c 70 29 3b 0a 20 20  >zName)+1,p);.  
d270: 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
d280: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
d290: 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  Old );  /* Mallo
d2a0: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
d2b0: 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e  ed inside HashIn
d2c0: 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  sert() */.      
d2d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d2e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
d2f0: 72 6e 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  rn;.    }.#ifnde
d300: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
d310: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f  REIGN_KEY.    fo
d320: 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79  r(pFKey=p->pFKey
d330: 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70  ; pFKey; pFKey=p
d340: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29  FKey->pNextFrom)
d350: 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 64 61  {.      void *da
d360: 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  ta;.      int nT
d370: 6f 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  o = sqlite3Strle
d380: 6e 33 30 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20  n30(pFKey->zTo) 
d390: 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  + 1;.      pFKey
d3a0: 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69  ->pNextTo = sqli
d3b0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63  te3HashFind(&pSc
d3c0: 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 4b  hema->aFKey, pFK
d3d0: 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20  ey->zTo, nTo);. 
d3e0: 20 20 20 20 20 64 61 74 61 20 3d 20 73 71 6c 69       data = sqli
d3f0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
d400: 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70  Schema->aFKey, p
d410: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20  FKey->zTo, nTo, 
d420: 70 46 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66  pFKey);.      if
d430: 28 20 64 61 74 61 3d 3d 28 76 6f 69 64 20 2a 29  ( data==(void *)
d440: 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  pFKey ){.       
d450: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d460: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
d470: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
d480: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
d490: 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e  e = 0;.    db->n
d4a0: 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d  Table++;.    db-
d4b0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
d4c0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
d4d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d4e0: 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
d4f0: 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c      if( !p->pSel
d500: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ect ){.      con
d510: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
d520: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
d530: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
d540: 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  n.z;.      int n
d550: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Name;.      asse
d560: 72 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20  rt( !pSelect && 
d570: 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b  pCons && pEnd );
d580: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73  .      if( pCons
d590: 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->z==0 ){.      
d5a0: 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a    pCons = pEnd;.
d5b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e        }.      nN
d5c0: 61 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e  ame = (int)((con
d5d0: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d  st char *)pCons-
d5e0: 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >z - zName);.   
d5f0: 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73     p->addColOffs
d600: 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65  et = 13 + sqlite
d610: 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61  3Utf8CharLen(zNa
d620: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
d630: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
d640: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d650: 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54  MIT_VIEW./*.** T
d660: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
d670: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20  this routine in 
d680: 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20  order to create 
d690: 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f  a new VIEW.*/.vo
d6a0: 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
d6b0: 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  View(.  Parse *p
d6c0: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
d6d0: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
d6e0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42  t */.  Token *pB
d6f0: 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65  egin,     /* The
d700: 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
d710: 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74  at begins the st
d720: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
d730: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
d740: 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
d750: 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
d760: 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
d770: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
d780: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
d790: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
d7a0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
d7b0: 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  w */.  Select *p
d7c0: 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53  Select,   /* A S
d7d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
d7e0: 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
d7f0: 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f   the new view */
d800: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
d810: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f        /* TRUE fo
d820: 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69  r a TEMPORARY vi
d830: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72  ew */.  int noEr
d840: 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  r          /* Su
d850: 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73  ppress error mes
d860: 73 61 67 65 73 20 69 66 20 56 49 45 57 20 61 6c  sages if VIEW al
d870: 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
d880: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
d890: 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20   int n;.  const 
d8a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
d8b0: 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
d8c0: 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
d8d0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a    Token *pName;.
d8e0: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c    int iDb;.  sql
d8f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
d900: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
d910: 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a  arse->nVar>0 ){.
d920: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d930: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72  Msg(pParse, "par
d940: 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20  ameters are not 
d950: 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73  allowed in views
d960: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ");.    sqlite3S
d970: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
d980: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
d990: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
d9a0: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
d9b0: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
d9c0: 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c  ame2, isTemp, 1,
d9d0: 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20   0, noErr);.  p 
d9e0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
d9f0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
da00: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
da10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
da20: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
da30: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
da40: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
da50: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
da60: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
da70: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
da80: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
da90: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
daa0: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69  p->pSchema);.  i
dab0: 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
dac0: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
dad0: 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e   iDb, "view", pN
dae0: 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69  ame).    && sqli
daf0: 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
db00: 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29  ix, pSelect).  )
db10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
db20: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
db30: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
db40: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rn;.  }..  /* Ma
db50: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
db60: 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
db70: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
db80: 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
db90: 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
dba0: 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
dbb0: 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
dbc0: 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
dbd0: 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
dbe0: 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
dbf0: 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
dc00: 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
dc10: 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
dc20: 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
dc30: 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
dc40: 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
dc50: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
dc60: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65  .  */.  p->pSele
dc70: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
dc80: 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63  ctDup(db, pSelec
dc90: 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
dca0: 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  E);.  sqlite3Sel
dcb0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
dcc0: 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62  elect);.  if( db
dcd0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
dce0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
dcf0: 7d 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  }.  if( !db->ini
dd00: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71  t.busy ){.    sq
dd10: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
dd20: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
dd30: 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  p);.  }..  /* Lo
dd40: 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  cate the end of 
dd50: 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20  the CREATE VIEW 
dd60: 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65  statement.  Make
dd70: 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20   sEnd point to. 
dd80: 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a   ** the end..  *
dd90: 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  /.  sEnd = pPars
dda0: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
ddb0: 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d   if( sEnd.z[0]!=
ddc0: 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d  0 && sEnd.z[0]!=
ddd0: 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
dde0: 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
ddf0: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
de00: 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e   n = (int)(sEnd.
de10: 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a  z - pBegin->z);.
de20: 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73    z = (const uns
de30: 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 65 67  igned char*)pBeg
de40: 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
de50: 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d  n>0 && (z[n-1]==
de60: 27 3b 27 20 7c 7c 20 73 71 6c 69 74 65 33 49 73  ';' || sqlite3Is
de70: 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29  space(z[n-1])) )
de80: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e  { n--; }.  sEnd.
de90: 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73  z = &z[n-1];.  s
dea0: 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  End.n = 1;..  /*
deb0: 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54   Use sqlite3EndT
dec0: 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68  able() to add th
ded0: 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51  e view to the SQ
dee0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
def0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e  e */.  sqlite3En
df00: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  dTable(pParse, 0
df10: 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72  , &sEnd, 0);.  r
df20: 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
df30: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
df40: 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  IEW */..#if !def
df50: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
df60: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
df70: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
df80: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a  IRTUALTABLE)./*.
df90: 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
dfa0: 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73  ucture pTable is
dfb0: 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20   really a VIEW. 
dfc0: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d   Fill in the nam
dfd0: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  es of.** the col
dfe0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77  umns of the view
dff0: 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73   in the pTable s
e000: 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72  tructure.  Retur
e010: 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  n the number.** 
e020: 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
e030: 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20  n error is seen 
e040: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
e050: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
e060: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  ->zErrMsg..*/.in
e070: 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  t sqlite3ViewGet
e080: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73  ColumnNames(Pars
e090: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
e0a0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62   *pTable){.  Tab
e0b0: 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f  le *pSelTab;   /
e0c0: 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66  * A fake table f
e0d0: 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74  rom which we get
e0e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
e0f0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
e100: 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  l;     /* Copy o
e110: 66 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61  f the SELECT tha
e120: 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
e130: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e   view */.  int n
e140: 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Err = 0;     /* 
e150: 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  Number of errors
e160: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a   encountered */.
e170: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
e180: 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69      /* Temporari
e190: 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d  ly holds the num
e1a0: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61  ber of cursors a
e1b0: 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c  ssigned */.  sql
e1c0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
e1d0: 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
e1e0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ase connection f
e1f0: 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
e200: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 41 75 74   */.  int (*xAut
e210: 68 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  h)(void*,int,con
e220: 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63  st char*,const c
e230: 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  har*,const char*
e240: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a  ,const char*);..
e250: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
e260: 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
e270: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
e280: 54 41 42 4c 45 0a 20 20 69 66 28 20 73 71 6c 69  TABLE.  if( sqli
e290: 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65  te3VtabCallConne
e2a0: 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  ct(pParse, pTabl
e2b0: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
e2c0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
e2d0: 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75   }.  if( IsVirtu
e2e0: 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74  al(pTable) ) ret
e2f0: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  urn 0;.#endif..#
e300: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e310: 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70  IT_VIEW.  /* A p
e320: 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
e330: 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
e340: 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
e350: 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
e360: 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
e370: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
e380: 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
e390: 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
e3a0: 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
e3b0: 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
e3c0: 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
e3d0: 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
e3e0: 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
e3f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
e400: 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
e410: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
e420: 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
e430: 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
e440: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
e450: 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
e460: 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
e470: 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
e480: 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
e490: 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
e4a0: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
e4b0: 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
e4c0: 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
e4d0: 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
e4e0: 20 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63   this error is c
e4f0: 61 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79  aught previously
e500: 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c   and so the foll
e510: 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20  owing test.  ** 
e520: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61  should always fa
e530: 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c  il.  But we will
e540: 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61   leave it in pla
e550: 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61  ce just to be sa
e560: 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  fe..  */.  if( p
e570: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b  Table->nCol<0 ){
e580: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
e590: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
e5a0: 65 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61  ew %s is circula
e5b0: 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54  rly defined", pT
e5c0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
e5d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
e5e0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
e5f0: 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20  ->nCol>=0 );..  
e600: 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
e610: 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
e620: 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  we need to compu
e630: 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
e640: 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68  es..  ** Note th
e650: 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  at the call to s
e660: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
e670: 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65  fSelect() will e
e680: 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22  xpand any.  ** "
e690: 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  *" elements in t
e6a0: 68 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f  he results set o
e6b0: 66 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77  f the view and w
e6c0: 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f  ill assign curso
e6d0: 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65  rs.  ** to the e
e6e0: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46  lements of the F
e6f0: 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74  ROM clause.  But
e700: 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   we do not want 
e710: 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20  these changes.  
e720: 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65  ** to be permane
e730: 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70  nt.  So the comp
e740: 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20  utation is done 
e750: 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  on a copy of the
e760: 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61   SELECT.  ** sta
e770: 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
e780: 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
e790: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
e7a0: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  ble->pSelect );.
e7b0: 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33    pSel = sqlite3
e7c0: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
e7d0: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30  able->pSelect, 0
e7e0: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b  );.  if( pSel ){
e7f0: 0a 20 20 20 20 69 6e 74 20 65 6e 61 62 6c 65 4c  .    int enableL
e800: 6f 6f 6b 61 73 69 64 65 20 3d 20 64 62 2d 3e 6c  ookaside = db->l
e810: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
e820: 64 3b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73  d;.    n = pPars
e830: 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c  e->nTab;.    sql
e840: 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
e850: 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
e860: 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20   pSel->pSrc);.  
e870: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
e880: 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f   -1;.    db->loo
e890: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20  kaside.bEnabled 
e8a0: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
e8b0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
e8c0: 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68  ZATION.    xAuth
e8d0: 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20   = db->xAuth;.  
e8e0: 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b    db->xAuth = 0;
e8f0: 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73  .    pSelTab = s
e900: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
e910: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
e920: 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78  pSel);.    db->x
e930: 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65  Auth = xAuth;.#e
e940: 6c 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20  lse.    pSelTab 
e950: 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
e960: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
e970: 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66  e, pSel);.#endif
e980: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
e990: 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 65 6e  de.bEnabled = en
e9a0: 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b 0a 20  ableLookaside;. 
e9b0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
e9c0: 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 53 65  = n;.    if( pSe
e9d0: 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 61 73  lTab ){.      as
e9e0: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43  sert( pTable->aC
e9f0: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ol==0 );.      p
ea00: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53  Table->nCol = pS
ea10: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
ea20: 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
ea30: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
ea40: 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  .      pSelTab->
ea50: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
ea60: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
ea70: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
ea80: 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c  DeleteTable(pSel
ea90: 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Tab);.      pTab
eaa0: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61  le->pSchema->fla
eab0: 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74  gs |= DB_Unreset
eac0: 56 69 65 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65  Views;.    }else
ead0: 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  {.      pTable->
eae0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
eaf0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nErr++;.    }.  
eb00: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
eb10: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b  elete(db, pSel);
eb20: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
eb30: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64  nErr++;.  }.#end
eb40: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
eb50: 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75  T_VIEW */.  retu
eb60: 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e  rn nErr;  .}.#en
eb70: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
eb80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
eb90: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
eba0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
ebb0: 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e  LTABLE) */..#ifn
ebc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ebd0: 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  VIEW./*.** Clear
ebe0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
ebf0: 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45  s from every VIE
ec00: 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64  W in database id
ec10: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
ec20: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
ec30: 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  tAll(sqlite3 *db
ec40: 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61  , int idx){.  Ha
ec50: 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28  shElem *i;.  if(
ec60: 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
ec70: 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
ec80: 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75  setViews) ) retu
ec90: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  rn;.  for(i=sqli
eca0: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
ecb0: 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d  >aDb[idx].pSchem
ecc0: 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69  a->tblHash); i;i
ecd0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
ece0: 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
ecf0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
ed00: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
ed10: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
ed20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52  ){.      sqliteR
ed30: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
ed40: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTab);.    }.  }
ed50: 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72  .  DbClearProper
ed60: 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
ed70: 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a  nresetViews);.}.
ed80: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
ed90: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
eda0: 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a  l(A,B).#endif /*
edb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
edc0: 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  W */../*.** This
edd0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
ede0: 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20  led by the VDBE 
edf0: 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e  to adjust the in
ee00: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
ee10: 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20   used by SQLite 
ee20: 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c  when the btree l
ee30: 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62  ayer moves a tab
ee40: 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68  le root page. Th
ee50: 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f  e.** root-page o
ee60: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
ee70: 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  ex in database i
ee80: 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66  Db has changed f
ee90: 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20  rom iFrom.** to 
eea0: 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65  iTo..**.** Ticke
eeb0: 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79  t #1728:  The sy
eec0: 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  mbol table might
eed0: 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69   still contain i
eee0: 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e  nformation.** on
eef0: 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69   tables and/or i
ef00: 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20  ndices that are 
ef10: 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62  the process of b
ef20: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
ef30: 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75   If you are unlu
ef40: 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73  cky, one of thos
ef50: 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
ef60: 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68  s or tables migh
ef70: 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61  t.** have the sa
ef80: 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62  me rootpage numb
ef90: 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74  er as the real t
efa0: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68  able or index th
efb0: 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d  at is.** being m
efc0: 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  oved.  So we can
efd0: 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69  not stop searchi
efe0: 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72  ng after the fir
eff0: 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63  st match .** bec
f000: 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d  ause the first m
f010: 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f  atch might be fo
f020: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c  r one of the del
f030: 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20  eted indices.** 
f040: 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f  or tables and no
f050: 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  t the table/inde
f060: 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c  x that is actual
f070: 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a  ly being moved..
f080: 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69  ** We must conti
f090: 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69  nue looping unti
f0a0: 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64  l all tables and
f0b0: 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a   indices with.**
f0c0: 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d   rootpage==iFrom
f0d0: 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65   have been conve
f0e0: 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72  rted to have a r
f0f0: 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a  ootpage of iTo.*
f100: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  * in order to be
f110: 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65   certain that we
f120: 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   got the right o
f130: 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ne..*/.#ifndef S
f140: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
f150: 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74  ACUUM.void sqlit
f160: 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28  e3RootPageMoved(
f170: 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46 72  Db *pDb, int iFr
f180: 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20  om, int iTo){.  
f190: 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
f1a0: 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a  .  Hash *pHash;.
f1b0: 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
f1c0: 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
f1d0: 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
f1e0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
f1f0: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
f200: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
f210: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
f220: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
f230: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
f240: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  em);.    if( pTa
f250: 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  b->tnum==iFrom )
f260: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e  {.      pTab->tn
f270: 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a  um = iTo;.    }.
f280: 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70    }.  pHash = &p
f290: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db->pSchema->idx
f2a0: 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65  Hash;.  for(pEle
f2b0: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
f2c0: 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  t(pHash); pElem;
f2d0: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
f2e0: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
f2f0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
f300: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
f310: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
f320: 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pIdx->tnum==iFro
f330: 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  m ){.      pIdx-
f340: 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
f350: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
f360: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64  ./*.** Write cod
f370: 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74  e to erase the t
f380: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
f390: 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20  age iTable from 
f3a0: 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a  database iDb..**
f3b0: 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65   Also write code
f3c0: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73   to modify the s
f3d0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
f3e0: 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  le and internal 
f3f0: 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72  schema.** if a r
f400: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74  oot-page of anot
f410: 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
f420: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d  ed by the btree-
f430: 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20  layer whilst.** 
f440: 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28  erasing iTable (
f450: 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
f460: 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
f470: 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
f480: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  / .static void d
f490: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50  estroyRootPage(P
f4a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
f4b0: 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44  t iTable, int iD
f4c0: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
f4d0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
f4e0: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31  Parse);.  int r1
f4f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
f500: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
f510: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f520: 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  3(v, OP_Destroy,
f530: 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44 62   iTable, r1, iDb
f540: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
f550: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
f560: 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f  M.  /* OP_Destro
f570: 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69  y stores an in i
f580: 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20 74 68  nteger r1. If th
f590: 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20  is integer.  ** 
f5a0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
f5b0: 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  n it is the root
f5c0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
f5d0: 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f  a table moved to
f5e0: 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69  .  ** location i
f5f0: 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f  Table. The follo
f600: 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69  wing code modifi
f610: 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  es the sqlite_ma
f620: 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20  ster table to.  
f630: 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e  ** reflect this.
f640: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22  .  **.  ** The "
f650: 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51 4c  #NNN" in the SQL
f660: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f   is a special co
f670: 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e  nstant that mean
f680: 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65  s whatever value
f690: 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67 69  .  ** is in regi
f6a0: 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20 73  ster NNN.  See s
f6b0: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 45 78  qlite3RegisterEx
f6c0: 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  pr()..  */.  sql
f6d0: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
f6e0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55  pParse, .     "U
f6f0: 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20  PDATE %Q.%s SET 
f700: 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52  rootpage=%d WHER
f710: 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61  E #%d AND rootpa
f720: 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50  ge=#%d",.     pP
f730: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
f740: 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
f750: 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61  _TABLE(iDb), iTa
f760: 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65  ble, r1, r1);.#e
f770: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65  ndif.  sqlite3Re
f780: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
f790: 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a  rse, r1);.}../*.
f7a0: 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63 6f  ** Write VDBE co
f7b0: 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c  de to erase tabl
f7c0: 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61  e pTab and all a
f7d0: 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65  ssociated indice
f7e0: 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f  s on disk..** Co
f7f0: 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  de to update the
f800: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
f810: 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e  ables and intern
f820: 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69  al schema defini
f830: 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65  tions.** in case
f840: 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c   a root-page bel
f850: 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65  onging to anothe
f860: 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
f870: 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c 61   by the btree la
f880: 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61  yer.** is also a
f890: 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20 68  dded (this can h
f8a0: 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
f8b0: 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
f8c0: 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  se)..*/.static v
f8d0: 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65  oid destroyTable
f8e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
f8f0: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69  Table *pTab){.#i
f900: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
f910: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e  _AUTOVACUUM.  In
f920: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
f930: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
f940: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
f950: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
f960: 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f  chema);.  destro
f970: 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
f980: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44  , pTab->tnum, iD
f990: 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70  b);.  for(pIdx=p
f9a0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
f9b0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
f9c0: 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f  ext){.    destro
f9d0: 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
f9e0: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
f9f0: 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  b);.  }.#else.  
fa00: 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
fa10: 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76  se may be auto-v
fa20: 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69  acuum capable (i
fa30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
fa40: 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73  TOVACUUM.  ** is
fa50: 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74   not defined), t
fa60: 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74  hen it is import
fa70: 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44  ant to call OP_D
fa80: 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20  estroy on the.  
fa90: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ** table and ind
faa0: 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e  ex root-pages in
fab0: 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67   order, starting
fac0: 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69   with the numeri
fad0: 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67  cally .  ** larg
fae0: 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
faf0: 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72 61  mber. This guara
fb00: 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20  ntees that none 
fb10: 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  of the root-page
fb20: 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73  s.  ** to be des
fb30: 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61  troyed is reloca
fb40: 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ted by an earlie
fb50: 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e  r OP_Destroy. i.
fb60: 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66  e. if the.  ** f
fb70: 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f  ollowing were co
fb80: 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  ded:.  **.  ** O
fb90: 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20  P_Destroy 4 0.  
fba0: 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44  ** ....  ** OP_D
fbb0: 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a  estroy 5 0.  **.
fbc0: 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61    ** and root pa
fbd0: 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f  ge 5 happened to
fbe0: 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74 20   be the largest 
fbf0: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
fc00: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
fc10: 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74  abase, then root
fc20: 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65   page 5 would be
fc30: 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34   moved to page 4
fc40: 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f   by the .  ** "O
fc50: 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f  P_Destroy 4 0" o
fc60: 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65  pcode. The subse
fc70: 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f  quent "OP_Destro
fc80: 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74  y 5 0" would hit
fc90: 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73  .  ** a free-lis
fca0: 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  t page..  */.  i
fcb0: 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e  nt iTab = pTab->
fcc0: 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73  tnum;.  int iDes
fcd0: 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77  troyed = 0;..  w
fce0: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49  hile( 1 ){.    I
fcf0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
fd00: 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30  int iLargest = 0
fd10: 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73 74  ;..    if( iDest
fd20: 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62  royed==0 || iTab
fd30: 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20  <iDestroyed ){. 
fd40: 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
fd50: 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iTab;.    }.    
fd60: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
fd70: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
fd80: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
fd90: 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d        int iIdx =
fda0: 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20   pIdx->tnum;.   
fdb0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
fdc0: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
fdd0: 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
fde0: 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65 64   if( (iDestroyed
fdf0: 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65  ==0 || (iIdx<iDe
fe00: 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49 64  stroyed)) && iId
fe10: 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20  x>iLargest ){.  
fe20: 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
fe30: 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20   iIdx;.      }. 
fe40: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61     }.    if( iLa
fe50: 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  rgest==0 ){.    
fe60: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65    return;.    }e
fe70: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
fe80: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
fe90: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
fea0: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
feb0: 65 6d 61 29 3b 0a 20 20 20 20 20 20 64 65 73 74  ema);.      dest
fec0: 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
fed0: 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44  se, iLargest, iD
fee0: 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72  b);.      iDestr
fef0: 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b  oyed = iLargest;
ff00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
ff10: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  f.}../*.** This 
ff20: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
ff30: 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b  d to do the work
ff40: 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45   of a DROP TABLE
ff50: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70   statement..** p
ff60: 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  Name is the name
ff70: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
ff80: 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a   be dropped..*/.
ff90: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
ffa0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
ffb0: 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
ffc0: 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c  ame, int isView,
ffd0: 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54   int noErr){.  T
ffe0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64  able *pTab;.  Vd
fff0: 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
10000 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10010 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
10020 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
10030 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
10040 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
10050 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
10060 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
10070 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
10080 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  );.  pTab = sqli
10090 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
100a0 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 0a  Parse, isView, .
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100c0 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d              pNam
100d0 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
100e0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
100f0 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54  base);..  if( pT
10100 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ab==0 ){.    if(
10110 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20   noErr ){.      
10120 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65 61  sqlite3ErrorClea
10130 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  r(pParse);.    }
10140 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
10150 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
10160 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
10170 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
10180 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
10190 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
101a0 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
101b0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62  );..  /* If pTab
101c0 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61   is a virtual ta
101d0 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47 65  ble, call ViewGe
101e0 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74  tColumnNames() t
101f0 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74  o ensure.  ** it
10200 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
10210 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  .  */.  if( IsVi
10220 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20 73  rtual(pTab) && s
10230 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
10240 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
10250 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f   pTab) ){.    go
10260 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
10270 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  le;.  }.#ifndef 
10280 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
10290 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
102a0 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
102b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
102c0 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
102d0 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  iDb);.    const 
102e0 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
102f0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
10300 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10310 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69  zArg2 = 0;.    i
10320 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
10330 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
10340 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
10350 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20   0, zDb)){.     
10360 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
10370 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
10380 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
10390 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
103a0 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
103b0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
103c0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
103d0 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
103e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
103f0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
10400 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23  _VIEW;.      }.#
10410 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10420 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
10430 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
10440 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
10450 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51  .      code = SQ
10460 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45  LITE_DROP_VTABLE
10470 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20  ;.      zArg2 = 
10480 70 54 61 62 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d  pTab->pMod->zNam
10490 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  e;.#endif.    }e
104a0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
104b0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
104c0 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
104d0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
104e0 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ROP_TEMP_TABLE;.
104f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10500 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
10510 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20  TE_DROP_TABLE;. 
10520 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
10530 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
10540 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
10550 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  de, pTab->zName,
10560 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a   zArg2, zDb) ){.
10570 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
10580 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
10590 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
105a0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
105b0 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
105c0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
105d0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
105e0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
105f0 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  able;.    }.  }.
10600 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c  #endif.  if( sql
10610 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
10620 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
10630 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20  e_", 7)==0 ){.  
10640 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10650 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
10660 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64   %s may not be d
10670 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ropped", pTab->z
10680 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
10690 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
106a0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
106b0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
106c0 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20   /* Ensure DROP 
106d0 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65  TABLE is not use
106e0 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64  d on a view, and
106f0 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f   DROP VIEW is no
10700 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61  t used.  ** on a
10710 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
10720 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61  f( isView && pTa
10730 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  b->pSelect==0 ){
10740 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
10750 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
10760 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20  e DROP TABLE to 
10770 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22  delete table %s"
10780 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
10790 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
107a0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
107b0 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70  if( !isView && p
107c0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
107d0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
107e0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
107f0 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65   DROP VIEW to de
10800 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70  lete view %s", p
10810 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
10820 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
10830 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  table;.  }.#endi
10840 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
10850 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
10860 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
10870 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a  he master table.
10880 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20    ** on disk..  
10890 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
108a0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
108b0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
108c0 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
108d0 72 3b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d  r;.    Db *pDb =
108e0 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
108f0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
10900 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
10910 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
10920 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10930 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
10940 45 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74  E.    if( IsVirt
10950 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
10960 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20     if( v ){.    
10970 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10980 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
10990 69 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  in);.      }.   
109a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
109b0 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67  * Drop all trigg
109c0 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ers associated w
109d0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65  ith the table be
109e0 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64  ing dropped. Cod
109f0 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e 65  e.    ** is gene
10a00 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  rated to remove 
10a10 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c  entries from sql
10a20 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f  ite_master and/o
10a30 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f  r.    ** sqlite_
10a40 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72  temp_master if r
10a50 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
10a60 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 73      pTrigger = s
10a70 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69 73  qlite3TriggerLis
10a80 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  t(pParse, pTab);
10a90 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69  .    while( pTri
10aa0 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73  gger ){.      as
10ab0 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e  sert( pTrigger->
10ac0 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
10ad0 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20  Schema || .     
10ae0 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70       pTrigger->p
10af0 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
10b00 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
10b10 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54      sqlite3DropT
10b20 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65  riggerPtr(pParse
10b30 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20  , pTrigger);.   
10b40 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
10b50 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  rigger->pNext;. 
10b60 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
10b70 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
10b80 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52  CREMENT.    /* R
10b90 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65  emove any entrie
10ba0 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  s of the sqlite_
10bb0 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61  sequence table a
10bc0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20  ssociated with. 
10bd0 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20     ** the table 
10be0 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54  being dropped. T
10bf0 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f  his is done befo
10c00 72 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  re the table is 
10c10 64 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20 61  dropped.    ** a
10c20 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65  t the btree leve
10c30 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  l, in case the s
10c40 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
10c50 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20  able needs to.  
10c60 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72    ** move as a r
10c70 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f  esult of the dro
10c80 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e  p (can happen in
10c90 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
10ca0 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  e)..    */.    i
10cb0 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  f( pTab->tabFlag
10cc0 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
10cd0 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ment ){.      sq
10ce0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
10cf0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
10d00 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73   "DELETE FROM %s
10d10 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
10d20 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
10d30 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
10d40 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
10d50 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
10d60 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
10d70 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d  rop all SQLITE_M
10d80 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20  ASTER table and 
10d90 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68  index entries th
10da0 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a  at refer to the.
10db0 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68      ** table. Th
10dc0 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c  e program name l
10dd0 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  oops through the
10de0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
10df0 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a  d deletes.    **
10e00 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20   every row that 
10e10 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
10e20 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
10e30 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65  me as the one be
10e40 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70  ing.    ** dropp
10e50 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65  ed. Triggers are
10e60 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74   handled seperat
10e70 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72  ely because a tr
10e80 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20  igger can be.   
10e90 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74   ** created in t
10ea0 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
10eb0 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
10ec0 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68  a table in anoth
10ed0 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  er.    ** databa
10ee0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  se..    */.    s
10ef0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
10f00 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
10f10 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
10f20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f  %Q.%s WHERE tbl_
10f30 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65  name=%Q and type
10f40 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20  !='trigger'",.  
10f50 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
10f60 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
10f70 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Db), pTab->zName
10f80 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20  );..    /* Drop 
10f90 61 6e 79 20 73 74 61 74 69 73 74 69 63 73 20 66  any statistics f
10fa0 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73  rom the sqlite_s
10fb0 74 61 74 31 20 74 61 62 6c 65 2c 20 69 66 20 69  tat1 table, if i
10fc0 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  t exists */.    
10fd0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
10fe0 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65  able(db, "sqlite
10ff0 5f 73 74 61 74 31 22 2c 20 64 62 2d 3e 61 44 62  _stat1", db->aDb
11000 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a  [iDb].zName) ){.
11010 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
11020 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
11030 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
11040 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f   FROM %Q.sqlite_
11050 73 74 61 74 31 20 57 48 45 52 45 20 74 62 6c 3d  stat1 WHERE tbl=
11060 25 51 22 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c  %Q", pDb->zName,
11070 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pTab->zName.   
11080 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
11090 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
110a0 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
110b0 20 29 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f   ){.      destro
110c0 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  yTable(pParse, p
110d0 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Tab);.    }..   
110e0 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74   /* Remove the t
110f0 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  able entry from 
11100 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61  SQLite's interna
11110 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64  l schema and mod
11120 69 66 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  ify.    ** the s
11130 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20  chema cookie..  
11140 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 73 56    */.    if( IsV
11150 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
11160 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11170 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44  eAddOp4(v, OP_VD
11180 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20  estroy, iDb, 0, 
11190 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  0, pTab->zName, 
111a0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
111b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
111c0 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c  v, OP_DropTable,
111d0 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62   iDb, 0, 0, pTab
111e0 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
111f0 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
11200 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
11210 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56  );.  }.  sqliteV
11220 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20  iewResetAll(db, 
11230 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70  iDb);..exit_drop
11240 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65  _table:.  sqlite
11250 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
11260 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  b, pName);.}../*
11270 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11280 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72   is called to cr
11290 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69  eate a new forei
112a0 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61  gn key on the ta
112b0 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ble.** currently
112c0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
112d0 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64  ion.  pFromCol d
112e0 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
112f0 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
11300 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
11310 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72  point to the for
11320 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46  eign key.  If pF
11330 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a  romCol==0 then.*
11340 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65  * connect the ke
11350 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f  y to the last co
11360 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20  lumn inserted.  
11370 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20  pTo is the name 
11380 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  of.** the table 
11390 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54  referred to.  pT
113a0 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f  oCol is a list o
113b0 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
113c0 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62  other.** pTo tab
113d0 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65  le that the fore
113e0 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74  ign key points t
113f0 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69  o.  flags contai
11400 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  ns all.** inform
11410 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
11420 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
11430 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73  ion algorithms s
11440 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74  pecified.** in t
11450 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e  he ON DELETE, ON
11460 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49   UPDATE and ON I
11470 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a  NSERT clauses..*
11480 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72  *.** An FKey str
11490 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
114a0 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  d and added to t
114b0 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
114c0 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73  ly.** under cons
114d0 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
114e0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
114f0 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65  e field.  The ne
11500 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74  w FKey.** is not
11510 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d   linked into db-
11520 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73 20 70  >aFKey at this p
11530 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73  oint - that does
11540 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75   not happen.** u
11550 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54  ntil sqlite3EndT
11560 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  able()..**.** Th
11570 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  e foreign key is
11580 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41   set for IMMEDIA
11590 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  TE processing.  
115a0 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  A subsequent cal
115b0 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44  l.** to sqlite3D
115c0 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29  eferForeignKey()
115d0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
115e0 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a  is to DEFERRED..
115f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
11600 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28  reateForeignKey(
11610 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11620 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
11630 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
11640 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43  ExprList *pFromC
11650 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ol,  /* Columns 
11660 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68  in this table th
11670 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65  at point to othe
11680 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b  r table */.  Tok
11690 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20  en *pTo,        
116a0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
116b0 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
116c0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43    ExprList *pToC
116d0 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
116e0 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74  s in the other t
116f0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  able */.  int fl
11700 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
11710 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
11720 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
11730 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  . */.){.  sqlite
11740 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
11750 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
11760 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
11770 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  KEY.  FKey *pFKe
11780 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a  y = 0;.  Table *
11790 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
117a0 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
117b0 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
117c0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
117d0 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
117e0 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
117f0 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
11800 45 72 72 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  Err || IN_DECLAR
11810 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
11820 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
11830 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
11840 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
11850 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  l-1;.    if( iCo
11860 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  l<0 ) goto fk_en
11870 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f  d;.    if( pToCo
11880 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
11890 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  pr!=1 ){.      s
118a0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
118b0 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20  Parse, "foreign 
118c0 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20  key on %s".     
118d0 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66      " should ref
118e0 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20  erence only one 
118f0 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
11900 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d  %T",.         p-
11910 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
11920 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67  e, pTo);.      g
11930 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
11940 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a  }.    nCol = 1;.
11950 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43    }else if( pToC
11960 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
11970 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  xpr!=pFromCol->n
11980 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Expr ){.    sqli
11990 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
119a0 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d  se,.        "num
119b0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
119c0 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f  n foreign key do
119d0 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
119e0 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20   number of ".   
119f0 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e       "columns in
11a00 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
11a10 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74  table");.    got
11a20 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73  o fk_end;.  }els
11a30 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46  e{.    nCol = pF
11a40 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20  romCol->nExpr;. 
11a50 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a   }.  nByte = siz
11a60 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43  eof(*pFKey) + nC
11a70 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d  ol*sizeof(pFKey-
11a80 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d  >aCol[0]) + pTo-
11a90 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54  >n + 1;.  if( pT
11aa0 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
11ab0 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e  i=0; i<pToCol->n
11ac0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
11ad0 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74    nByte += sqlit
11ae0 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f  e3Strlen30(pToCo
11af0 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b  l->a[i].zName) +
11b00 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
11b10 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44  pFKey = sqlite3D
11b20 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
11b30 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
11b40 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67  FKey==0 ){.    g
11b50 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a  oto fk_end;.  }.
11b60 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d    pFKey->pFrom =
11b70 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65   p;.  pFKey->pNe
11b80 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65  xtFrom = p->pFKe
11b90 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  y;.  z = (char*)
11ba0 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b  &pFKey[1];.  pFK
11bb0 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75  ey->aCol = (stru
11bc0 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20  ct sColMap*)z;. 
11bd0 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72   z += sizeof(str
11be0 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f  uct sColMap)*nCo
11bf0 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20  l;.  pFKey->zTo 
11c00 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  = z;.  memcpy(z,
11c10 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29   pTo->z, pTo->n)
11c20 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20  ;.  z[pTo->n] = 
11c30 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e  0;.  z += pTo->n
11c40 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65  +1;.  pFKey->pNe
11c50 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65  xtTo = 0;.  pFKe
11c60 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  y->nCol = nCol;.
11c70 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
11c80 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e  0 ){.    pFKey->
11c90 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[0].iFrom = 
11ca0 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c  p->nCol-1;.  }el
11cb0 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
11cc0 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
11cd0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
11ce0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
11cf0 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
11d00 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
11d10 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a  trICmp(p->aCol[j
11d20 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f  ].zName, pFromCo
11d30 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  l->a[i].zName)==
11d40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
11d50 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46  FKey->aCol[i].iF
11d60 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  rom = j;.       
11d70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
11d80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11d90 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c    if( j>=p->nCol
11da0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
11db0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11dc0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
11dd0 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c  unknown column \
11de0 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e  "%s\" in foreign
11df0 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22   key definition"
11e00 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  , .          pFr
11e10 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
11e20 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
11e30 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d   fk_end;.      }
11e40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
11e50 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
11e60 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
11e70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
11e80 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
11e90 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  n30(pToCol->a[i]
11ea0 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  .zName);.      p
11eb0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43  FKey->aCol[i].zC
11ec0 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65  ol = z;.      me
11ed0 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e  mcpy(z, pToCol->
11ee0 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  a[i].zName, n);.
11ef0 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a        z[n] = 0;.
11f00 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a        z += n+1;.
11f10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
11f20 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
11f30 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65  0;.  pFKey->dele
11f40 74 65 43 6f 6e 66 20 3d 20 28 75 38 29 28 66 6c  teConf = (u8)(fl
11f50 61 67 73 20 26 20 30 78 66 66 29 3b 0a 20 20 70  ags & 0xff);.  p
11f60 46 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66  FKey->updateConf
11f70 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20 3e   = (u8)((flags >
11f80 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b 0a 20  > 8 ) & 0xff);. 
11f90 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f   pFKey->insertCo
11fa0 6e 66 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73  nf = (u8)((flags
11fb0 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66 29   >> 16 ) & 0xff)
11fc0 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  ;..  /* Link the
11fd0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20   foreign key to 
11fe0 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65  the table as the
11ff0 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f   last step..  */
12000 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46  .  p->pFKey = pF
12010 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30  Key;.  pFKey = 0
12020 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c  ;..fk_end:.  sql
12030 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
12040 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  FKey);.#endif /*
12050 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
12060 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
12070 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  Y) */.  sqlite3E
12080 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
12090 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  , pFromCol);.  s
120a0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
120b0 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29  lete(db, pToCol)
120c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
120d0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
120e0 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41  d when an INITIA
120f0 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72  LLY IMMEDIATE or
12100 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
12110 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73  RED.** clause is
12120 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66   seen as part of
12130 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64   a foreign key d
12140 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20  efinition.  The 
12150 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61  isDeferred.** pa
12160 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72  rameter is 1 for
12170 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
12180 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e  RED and 0 for IN
12190 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
121a0 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69  E..** The behavi
121b0 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  or of the most r
121c0 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
121d0 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61  foreign key is a
121e0 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72  djusted.** accor
121f0 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  dingly..*/.void 
12200 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
12210 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50  ignKey(Parse *pP
12220 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65  arse, int isDefe
12230 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53  rred){.#ifndef S
12240 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
12250 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a  GN_KEY.  Table *
12260 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46  pTab;.  FKey *pF
12270 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62  Key;.  if( (pTab
12280 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
12290 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b  able)==0 || (pFK
122a0 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79  ey = pTab->pFKey
122b0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
122c0 20 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72   assert( isDefer
122d0 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65  red==0 || isDefe
122e0 72 72 65 64 3d 3d 31 20 29 3b 0a 20 20 70 46 4b  rred==1 );.  pFK
122f0 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
12300 20 28 75 38 29 69 73 44 65 66 65 72 72 65 64 3b   (u8)isDeferred;
12310 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
12320 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
12330 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61  hat will erase a
12340 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20  nd refill index 
12350 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a  *pIdx.  This is.
12360 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69  ** used to initi
12370 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72  alize a newly cr
12380 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74  eated index or t
12390 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a  o recompute the.
123a0 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  ** content of an
123b0 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e   index in respon
123c0 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20  se to a REINDEX 
123d0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69  command..**.** i
123e0 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
123f0 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69   not negative, i
12400 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
12410 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a   index is newly.
12420 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  ** created.  The
12430 20 72 65 67 69 73 74 65 72 20 73 70 65 63 69 66   register specif
12440 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61  ied by memRootPa
12450 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a  ge contains the.
12460 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  ** root page num
12470 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
12480 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67  .  If memRootPag
12490 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
124a0 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  hen.** the index
124b0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
124c0 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61  and must be clea
124d0 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67  red before being
124e0 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a   refilled and.**
124f0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
12500 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
12510 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ex is taken from
12520 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a   pIndex->tnum..*
12530 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
12540 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
12550 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12560 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69  Index *pIndex, i
12570 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b  nt memRootPage){
12580 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
12590 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
125a0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
125b0 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a  hat is indexed *
125c0 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
125d0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
125e0 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
125f0 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62  or used for pTab
12600 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d   */.  int iIdx =
12610 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
12620 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
12630 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49  rsor used for pI
12640 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ndex */.  int ad
12650 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
12660 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
12670 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f  ess of top of lo
12680 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d  op */.  int tnum
12690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
126a0 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
126b0 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  age of index */.
126c0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
126d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
126f0 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74  e into this virt
12700 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20  ual machine */. 
12710 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20   KeyInfo *pKey; 
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69  /* KeyInfo for i
12740 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ndex */.  int re
12750 67 49 64 78 4b 65 79 3b 20 20 20 20 20 20 20 20  gIdxKey;        
12760 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
12770 73 74 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67  sters containing
12780 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 20 2a   the index key *
12790 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
127a0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
127b0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
127c0 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 69 65  olding assemblie
127d0 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  d index record *
127e0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
127f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
12800 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
12810 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
12820 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
12830 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
12840 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
12850 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
12860 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12870 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
12880 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
12890 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
128a0 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78  _REINDEX, pIndex
128b0 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20  ->zName, 0,.    
128c0 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
128d0 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65  Name ) ){.    re
128e0 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
128f0 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61  ..  /* Require a
12900 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
12910 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66  he table to perf
12920 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69  orm this operati
12930 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54  on */.  sqlite3T
12940 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
12950 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
12960 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 1, pTab->zName
12970 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  );..  v = sqlite
12980 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
12990 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
129a0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d  eturn;.  if( mem
129b0 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20  RootPage>=0 ){. 
129c0 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f     tnum = memRoo
129d0 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tPage;.  }else{.
129e0 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65      tnum = pInde
129f0 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71 6c  x->tnum;.    sql
12a00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12a10 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d  , OP_Clear, tnum
12a20 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 4b  , iDb);.  }.  pK
12a30 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ey = sqlite3Inde
12a40 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
12a50 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69   pIndex);.  sqli
12a60 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
12a70 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69   OP_OpenWrite, i
12a80 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20  Idx, tnum, iDb, 
12a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12aa0 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65       (char *)pKe
12ab0 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P4_KEYINFO_HA
12ac0 4e 44 4f 46 46 29 3b 0a 20 20 69 66 28 20 6d 65  NDOFF);.  if( me
12ad0 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a  mRootPage>=0 ){.
12ae0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
12af0 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20  hangeP5(v, 1);. 
12b00 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e   }.  sqlite3Open
12b10 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
12b20 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
12b30 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61  P_OpenRead);.  a
12b40 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
12b50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
12b60 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
12b70 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
12b80 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
12b90 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 49  (pParse);.  regI
12ba0 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 47  dxKey = sqlite3G
12bb0 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
12bc0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
12bd0 69 54 61 62 2c 20 72 65 67 52 65 63 6f 72 64 2c  iTab, regRecord,
12be0 20 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65   1);.  if( pInde
12bf0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
12c00 6f 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  one ){.    int j
12c10 31 2c 20 6a 32 3b 0a 20 20 20 20 69 6e 74 20 72  1, j2;.    int r
12c20 65 67 52 6f 77 69 64 3b 0a 0a 20 20 20 20 72 65  egRowid;..    re
12c30 67 52 6f 77 69 64 20 3d 20 72 65 67 49 64 78 4b  gRowid = regIdxK
12c40 65 79 20 2b 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  ey + pIndex->nCo
12c50 6c 75 6d 6e 3b 0a 20 20 20 20 6a 31 20 3d 20 73  lumn;.    j1 = s
12c60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12c70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
12c80 65 67 49 64 78 4b 65 79 2c 20 30 2c 20 70 49 6e  egIdxKey, 0, pIn
12c90 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dex->nColumn);. 
12ca0 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
12cb0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
12cc0 49 73 55 6e 69 71 75 65 2c 20 69 49 64 78 2c 0a  IsUnique, iIdx,.
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ce0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 72 65             0, re
12cf0 67 52 6f 77 69 64 2c 20 53 51 4c 49 54 45 5f 49  gRowid, SQLITE_I
12d00 4e 54 5f 54 4f 5f 50 54 52 28 72 65 67 52 65 63  NT_TO_PTR(regRec
12d10 6f 72 64 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  ord), P4_INT32);
12d20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12d30 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c  AddOp4(v, OP_Hal
12d40 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  t, SQLITE_CONSTR
12d50 41 49 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c 20  AINT, OE_Abort, 
12d60 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
12d70 20 20 20 20 20 20 20 22 69 6e 64 65 78 65 64 20         "indexed 
12d80 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20  columns are not 
12d90 75 6e 69 71 75 65 22 2c 20 50 34 5f 53 54 41 54  unique", P4_STAT
12da0 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
12db0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
12dc0 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  j1);.    sqlite3
12dd0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
12de0 6a 32 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  j2);.  }.  sqlit
12df0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12e00 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49  OP_IdxInsert, iI
12e10 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
12e20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
12e30 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
12e40 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
12e50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12e60 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62  v, OP_Next, iTab
12e70 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 73 71  , addr1+1);.  sq
12e80 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
12e90 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 73  e(v, addr1);.  s
12ea0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
12eb0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54  (v, OP_Close, iT
12ec0 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ab);.  sqlite3Vd
12ed0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
12ee0 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a 7d 0a 0a  lose, iIdx);.}..
12ef0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
12f00 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
12f10 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d  SQL table.  pNam
12f20 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65  e1.pName2 is the
12f30 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
12f40 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c  ex .** and pTblL
12f50 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ist is the name 
12f60 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
12f70 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
12f80 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
12f90 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
12fa0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
12fb0 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
12fc0 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
12fd0 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
12fe0 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
12ff0 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
13000 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
13010 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
13020 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
13030 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
13040 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
13050 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
13060 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
13070 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
13080 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
13090 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
130a0 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
130b0 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
130c0 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
130d0 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
130e0 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
130f0 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
13100 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
13110 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
13120 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
13130 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
13140 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
13150 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
13160 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tion.  .*/.void 
13170 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
13180 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
13190 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20  rse,     /* All 
131a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
131b0 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
131c0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
131d0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
131e0 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
131f0 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
13200 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
13210 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  ,     /* Second 
13220 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
13230 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
13240 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
13250 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65  blName, /* Table
13260 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70   to index. Use p
13270 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
13280 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c   if 0 */.  ExprL
13290 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
132a0 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
132b0 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
132c0 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
132d0 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41  r,       /* OE_A
132e0 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
132f0 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
13300 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
13310 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20  en *pStart,     
13320 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
13330 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
13340 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
13350 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
13360 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29         /* The ")
13370 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68  " that closes th
13380 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  e CREATE INDEX s
13390 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
133a0 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20  t sortOrder,    
133b0 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f   /* Sort order o
133c0 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68  f primary key wh
133d0 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a  en pList==NULL *
133e0 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69  /.  int ifNotExi
133f0 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65  st     /* Omit e
13400 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c  rror if index al
13410 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
13420 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
13430 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62   = 0;     /* Tab
13440 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
13450 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
13460 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  dex = 0;   /* Th
13470 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72  e index to be cr
13480 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eated */.  char 
13490 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  *zName = 0;     
134a0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
134b0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ndex */.  int nN
134c0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
134d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
134e0 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20  acters in zName 
134f0 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  */.  int i, j;. 
13500 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20   Token nullId;  
13510 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f        /* Fake to
13520 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79  ken for an empty
13530 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62   ID list */.  Db
13540 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20  Fixer sFix;     
13550 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e     /* For assign
13560 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d  ing database nam
13570 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a  es to pTable */.
13580 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d    int sortOrderM
13590 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68  ask;   /* 1 to h
135a0 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64  onor DESC in ind
135b0 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65  ex.  0 to ignore
135c0 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  . */.  sqlite3 *
135d0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
135e0 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
135f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
13600 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f  pecific table co
13610 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64  ntaining the ind
13620 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f  exed database */
13630 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
13640 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
13650 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
13660 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77   that is being w
13670 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ritten */.  Toke
13680 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20  n *pName = 0;   
13690 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
136a0 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
136b0 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20  x to create */. 
136c0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
136d0 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d  _item *pListItem
136e0 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
136f0 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20   over pList */. 
13700 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74   int nCol;.  int
13710 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 63   nExtra = 0;.  c
13720 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 0a 20 20  har *zExtra;..  
13730 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
13740 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
13750 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  iled || IN_DECLA
13760 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 67  RE_VTAB ){.    g
13770 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
13780 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
13790 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
137a0 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
137b0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
137c0 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
137d0 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
137e0 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
137f0 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  {..    /* Use th
13800 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78  e two-part index
13810 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
13820 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ne the database 
13830 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63  .    ** to searc
13840 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  h for the table.
13850 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65   'Fix' the table
13860 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62   name to this db
13870 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c  .    ** before l
13880 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61  ooking up the ta
13890 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
138a0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26  assert( pName1 &
138b0 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20  & pName2 );.    
138c0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
138d0 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
138e0 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
138f0 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66   &pName);.    if
13900 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65  ( iDb<0 ) goto e
13910 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13920 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
13930 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20  E_OMIT_TEMPDB.  
13940 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
13950 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61  x name was unqua
13960 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66  lified, check if
13970 20 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20   the the table. 
13980 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20     ** is a temp 
13990 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65  table. If so, se
139a0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  t the database t
139b0 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74  o 1. Do not do t
139c0 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e  his.    ** if in
139d0 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74  itialising a dat
139e0 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20  abase schema..  
139f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62    */.    if( !db
13a00 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
13a10 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69       pTab = sqli
13a20 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70  te3SrcListLookup
13a30 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d  (pParse, pTblNam
13a40 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  e);.      if( pN
13a50 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e  ame2 && pName2->
13a60 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20  n==0 && pTab && 
13a70 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  pTab->pSchema==d
13a80 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
13a90 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62  a ){.        iDb
13aa0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
13ab0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
13ac0 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e  if( sqlite3FixIn
13ad0 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
13ae0 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20  , iDb, "index", 
13af0 70 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20  pName) &&.      
13b00 20 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c    sqlite3FixSrcL
13b10 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e  ist(&sFix, pTblN
13b20 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ame).    ){.    
13b30 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65    /* Because the
13b40 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63   parser construc
13b50 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d  ts pTblName from
13b60 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69   a single identi
13b70 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73  fier,.      ** s
13b80 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
13b90 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e   can never fail.
13ba0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
13bb0 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (0);.    }.    p
13bc0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
13bd0 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
13be0 20 30 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b   0, pTblName->a[
13bf0 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  0].zName, .     
13c00 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30     pTblName->a[0
13c10 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
13c20 20 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20 64    if( !pTab || d
13c30 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13c40 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
13c50 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
13c60 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44  sert( db->aDb[iD
13c70 62 5d 2e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  b].pSchema==pTab
13c80 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d  ->pSchema );.  }
13c90 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
13ca0 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  ( pName==0 );.  
13cb0 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d    pTab = pParse-
13cc0 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >pNewTable;.    
13cd0 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
13ce0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13cf0 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ex;.    iDb = sq
13d00 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
13d10 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
13d20 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62  hema);.  }.  pDb
13d30 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
13d40 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  ;..  if( pTab==0
13d50 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
13d60 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
13d70 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28  ate_index;.  if(
13d80 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
13d90 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
13da0 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a  qlite_", 7)==0 .
13db0 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70         && memcmp
13dc0 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d  (&pTab->zName[7]
13dd0 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21  ,"altertab_",9)!
13de0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13df0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13e00 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
13e10 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
13e20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
13e30 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
13e40 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
13e50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13e60 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54  IT_VIEW.  if( pT
13e70 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
13e80 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13e90 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
13ea0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
13eb0 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
13ec0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13ed0 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ex;.  }.#endif.#
13ee0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13ef0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
13f00 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
13f10 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
13f20 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13f30 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61  rse, "virtual ta
13f40 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  bles may not be 
13f50 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
13f60 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
13f70 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
13f80 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  f..  /*.  ** Fin
13f90 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
13fa0 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73  e index.  Make s
13fb0 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74  ure there is not
13fc0 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72   already another
13fd0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
13fe0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61  able with the sa
13ff0 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a  me name.  .  **.
14000 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
14010 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69   If we are readi
14020 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ng the names of 
14030 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65  permanent indice
14040 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  s from the.  ** 
14050 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
14060 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d  ble (because som
14070 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
14080 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65  changed the sche
14090 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65  ma) and.  ** one
140a0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   of the index na
140b0 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74  mes collides wit
140c0 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  h the name of a 
140d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
140e0 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  or.  ** index, t
140f0 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74  hen we will cont
14100 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20  inue to process 
14110 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a  this index..  **
14120 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d  .  ** If pName==
14130 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  0 it means that 
14140 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c  we are.  ** deal
14150 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61  ing with a prima
14160 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45  ry key or UNIQUE
14170 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65   constraint.  We
14180 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20   have to invent 
14190 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d  our.  ** own nam
141a0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  e..  */.  if( pN
141b0 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
141c0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
141d0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
141e0 65 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  e);.    if( SQLI
141f0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
14200 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
14210 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
14220 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
14230 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
14240 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
14250 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51  ndex;.    if( SQ
14260 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
14270 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
14280 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
14290 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
142a0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
142b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64      }.    if( !d
142c0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
142d0 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
142e0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
142f0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
14300 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
14310 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 69  e_index;.      i
14320 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
14330 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  ble(db, zName, 0
14340 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
14350 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14360 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
14370 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c  s already a tabl
14380 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  e named %s", zNa
14390 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
143a0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
143b0 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
143c0 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
143d0 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
143e0 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d  zName, pDb->zNam
143f0 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)!=0 ){.      i
14400 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29  f( !ifNotExist )
14410 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14420 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14430 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65  , "index %s alre
14440 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61  ady exists", zNa
14450 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
14460 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
14470 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
14480 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
14490 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t n;.    Index *
144a0 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70  pLoop;.    for(p
144b0 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  Loop=pTab->pInde
144c0 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70  x, n=1; pLoop; p
144d0 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78  Loop=pLoop->pNex
144e0 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e  t, n++){}.    zN
144f0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
14500 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65  intf(db, "sqlite
14510 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64  _autoindex_%s_%d
14520 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
14530 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  n);.    if( zNam
14540 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  e==0 ){.      go
14550 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
14560 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
14570 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
14580 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
14590 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
145a0 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
145b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
145c0 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
145d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
145e0 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20   = pDb->zName;. 
145f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
14600 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
14610 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
14620 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
14630 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
14640 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
14650 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
14660 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f  .    i = SQLITE_
14670 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20  CREATE_INDEX;.  
14680 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
14690 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69  DB && iDb==1 ) i
146a0 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
146b0 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
146c0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
146d0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c  Check(pParse, i,
146e0 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e   zName, pTab->zN
146f0 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
14700 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
14710 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
14720 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
14730 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69  * If pList==0, i
14740 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75  t means this rou
14750 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20  tine was called 
14760 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72  to make a primar
14770 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f  y.  ** key out o
14780 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  f the last colum
14790 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  n added to the t
147a0 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
147b0 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f  ruction..  ** So
147c0 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c   create a fake l
147d0 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  ist to simulate 
147e0 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  this..  */.  if(
147f0 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
14800 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 28 75 38 2a   nullId.z = (u8*
14810 29 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62  )pTab->aCol[pTab
14820 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b  ->nCol-1].zName;
14830 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20  .    nullId.n = 
14840 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
14850 28 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29  (char*)nullId.z)
14860 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
14870 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
14880 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30  end(pParse, 0, 0
14890 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20  , &nullId);.    
148a0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67  if( pList==0 ) g
148b0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
148c0 69 6e 64 65 78 3b 0a 20 20 20 20 70 4c 69 73 74  index;.    pList
148d0 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
148e0 20 3d 20 28 75 38 29 73 6f 72 74 4f 72 64 65 72   = (u8)sortOrder
148f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
14900 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
14910 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
14920 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  re required to s
14930 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a  tore explicitly.
14940 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63    ** specified c
14950 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
14960 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20  e names..  */.  
14970 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
14980 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
14990 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a     Expr *pExpr;.
149a0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
149b0 6c 6c 3b 0a 20 20 20 20 69 66 28 20 28 70 45 78  ll;.    if( (pEx
149c0 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
149d0 2e 70 45 78 70 72 29 21 3d 30 20 26 26 20 28 70  .pExpr)!=0 && (p
149e0 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43  Coll = pExpr->pC
149f0 6f 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  oll)!=0 ){.     
14a00 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20   nExtra += (1 + 
14a10 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
14a20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  pColl->zName));.
14a30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14a40 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  ** Allocate t
14a50 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
14a60 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d  re. .  */.  nNam
14a70 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
14a80 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 43  n30(zName);.  nC
14a90 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ol = pList->nExp
14aa0 72 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  r;.  pIndex = sq
14ab0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
14ac0 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 73 69 7a  o(db, .      siz
14ad0 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 20 20 20  eof(Index) +    
14ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
14af0 65 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f  ex structure  */
14b00 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e  .      sizeof(in
14b10 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  t)*nCol +       
14b20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43      /* Index.aiC
14b30 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20  olumn   */.     
14b40 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 43   sizeof(int)*(nC
14b50 6f 6c 2b 31 29 20 2b 20 20 20 20 20 20 20 2f 2a  ol+1) +       /*
14b60 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 20   Index.aiRowEst 
14b70 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f    */.      sizeo
14b80 66 28 63 68 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b  f(char *)*nCol +
14b90 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
14ba0 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20  .azColl     */. 
14bb0 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a       sizeof(u8)*
14bc0 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20  nCol +          
14bd0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74    /* Index.aSort
14be0 4f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 6e  Order */.      n
14bf0 4e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20  Name + 1 +      
14c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14c10 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20 20 20 20  ndex.zName      
14c20 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  */.      nExtra 
14c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c40 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
14c50 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
14c60 73 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20  s */.  );.  if( 
14c70 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14c80 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
14c90 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
14ca0 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 61 7a    }.  pIndex->az
14cb0 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 28  Coll = (char**)(
14cc0 26 70 49 6e 64 65 78 5b 31 5d 29 3b 0a 20 20 70  &pIndex[1]);.  p
14cd0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20  Index->aiColumn 
14ce0 3d 20 28 69 6e 74 20 2a 29 28 26 70 49 6e 64 65  = (int *)(&pInde
14cf0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29  x->azColl[nCol])
14d00 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f  ;.  pIndex->aiRo
14d10 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  wEst = (unsigned
14d20 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 43   *)(&pIndex->aiC
14d30 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20 20  olumn[nCol]);.  
14d40 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
14d50 65 72 20 3d 20 28 75 38 20 2a 29 28 26 70 49 6e  er = (u8 *)(&pIn
14d60 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b 6e 43  dex->aiRowEst[nC
14d70 6f 6c 2b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78  ol+1]);.  pIndex
14d80 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 20  ->zName = (char 
14d90 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 53 6f 72  *)(&pIndex->aSor
14da0 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a 20  tOrder[nCol]);. 
14db0 20 7a 45 78 74 72 61 20 3d 20 28 63 68 61 72 20   zExtra = (char 
14dc0 2a 29 28 26 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  *)(&pIndex->zNam
14dd0 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20 6d  e[nName+1]);.  m
14de0 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e  emcpy(pIndex->zN
14df0 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ame, zName, nNam
14e00 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  e+1);.  pIndex->
14e10 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
14e20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
14e30 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
14e40 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  .  pIndex->onErr
14e50 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  or = (u8)onError
14e60 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  ;.  pIndex->auto
14e70 49 6e 64 65 78 20 3d 20 28 75 38 29 28 70 4e 61  Index = (u8)(pNa
14e80 6d 65 3d 3d 30 29 3b 0a 20 20 70 49 6e 64 65 78  me==0);.  pIndex
14e90 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
14ea0 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
14eb0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
14ec0 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c   see if we shoul
14ed0 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71  d honor DESC req
14ee0 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63  uests on index c
14ef0 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66  olumns.  */.  if
14f00 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
14f10 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
14f20 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
14f30 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48  ask = -1;   /* H
14f40 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d  onor DESC */.  }
14f50 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72  else{.    sortOr
14f60 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  derMask = 0;    
14f70 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a  /* Ignore DESC *
14f80 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e  /.  }..  /* Scan
14f90 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
14fa0 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
14fb0 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
14fc0 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  exed and.  ** lo
14fd0 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  ad the column in
14fe0 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49  dices into the I
14ff0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
15000 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
15010 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c  .  ** if any col
15020 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  umn is not found
15030 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
15040 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73  , pListItem=pLis
15050 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  t->a; i<pList->n
15060 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74  Expr; i++, pList
15070 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  Item++){.    con
15080 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d  st char *zColNam
15090 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a  e = pListItem->z
150a0 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e  Name;.    Column
150b0 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69   *pTabCol;.    i
150c0 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74  nt requestedSort
150d0 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20  Order;.    char 
150e0 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
150f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
15100 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
15110 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72  name */..    for
15120 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54  (j=0, pTabCol=pT
15130 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62  ab->aCol; j<pTab
15140 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61  ->nCol; j++, pTa
15150 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  bCol++){.      i
15160 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
15170 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62  p(zColName, pTab
15180 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col->zName)==0 )
15190 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
151a0 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
151b0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
151c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
151d0 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68  rse, "table %s h
151e0 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
151f0 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  ed %s",.        
15200 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
15210 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  lName);.      go
15220 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
15230 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
15240 2f 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20 61 20  /* TODO:  Add a 
15250 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72  test to make sur
15260 65 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  e that the same 
15270 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61  column is not na
15280 6d 65 64 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20  med.    ** more 
15290 74 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e  than once within
152a0 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e   the same index.
152b0 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74    Only the first
152c0 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20 20   instance of.   
152d0 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77   ** the column w
152e0 69 6c 6c 20 65 76 65 72 20 62 65 20 75 73 65 64  ill ever be used
152f0 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65   by the optimize
15300 72 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 75 73  r.  Note that us
15310 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  ing the.    ** s
15320 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20  ame column more 
15330 74 68 61 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f 74  than once cannot
15340 20 62 65 20 61 6e 20 65 72 72 6f 72 20 62 65 63   be an error bec
15350 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
15360 0a 20 20 20 20 2a 2a 20 62 72 65 61 6b 20 62 61  .    ** break ba
15370 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
15380 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65 64 73  ility - it needs
15390 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69 6e 67   to be a warning
153a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
153b0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
153c0 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c   = j;.    if( pL
153d0 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 26  istItem->pExpr &
153e0 26 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  & pListItem->pEx
153f0 70 72 2d 3e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  pr->pColl ){.   
15400 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
15410 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f  Item->pExpr->pCo
15420 6c 6c 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  ll );.      zCol
15430 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20  l = zExtra;.    
15440 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
15450 74 66 28 6e 45 78 74 72 61 2c 20 7a 45 78 74 72  tf(nExtra, zExtr
15460 61 2c 20 22 25 73 22 2c 20 70 4c 69 73 74 49 74  a, "%s", pListIt
15470 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  em->pExpr->pColl
15480 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
15490 7a 45 78 74 72 61 20 2b 3d 20 28 73 71 6c 69 74  zExtra += (sqlit
154a0 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c  e3Strlen30(zColl
154b0 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73  ) + 1);.    }els
154c0 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  e{.      zColl =
154d0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
154e0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  Coll;.      if( 
154f0 21 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !zColl ){.      
15500 20 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44    zColl = db->pD
15510 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  fltColl->zName;.
15520 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15530 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
15540 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65 33  busy && !sqlite3
15550 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
15560 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29  arse, zColl, -1)
15570 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
15580 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
15590 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
155a0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
155b0 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65  zColl;.    reque
155c0 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20  stedSortOrder = 
155d0 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f  pListItem->sortO
155e0 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72  rder & sortOrder
155f0 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78  Mask;.    pIndex
15600 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
15610 3d 20 28 75 38 29 72 65 71 75 65 73 74 65 64 53  = (u8)requestedS
15620 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20  ortOrder;.  }.  
15630 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f  sqlite3DefaultRo
15640 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 0a 20  wEst(pIndex);.. 
15650 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73   if( pTab==pPars
15660 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a  e->pNewTable ){.
15670 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74      /* This rout
15680 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ine has been cal
15690 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  led to create an
156a0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
156b0 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73   as a.    ** res
156c0 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59  ult of a PRIMARY
156d0 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
156e0 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d  lause on a colum
156f0 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72  n definition, or
15700 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52  .    ** a PRIMAR
15710 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
15720 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67  clause following
15730 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69   the column defi
15740 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  nitions..    ** 
15750 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20  i.e. one of:.   
15760 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54   **.    ** CREAT
15770 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d  E TABLE t(x PRIM
15780 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20  ARY KEY, y);.   
15790 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
157a0 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28   t(x, y, UNIQUE(
157b0 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20  x, y));.    **. 
157c0 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79     ** Either way
157d0 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
157e0 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
157f0 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20  ady has such an 
15800 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a  index. If.    **
15810 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65   so, don't bothe
15820 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20  r creating this 
15830 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61  one. This only a
15840 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a  pplies to.    **
15850 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
15860 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20  reated indices. 
15870 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20  Users can do as 
15880 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20  they wish with. 
15890 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69     ** explicit i
158a0 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  ndices..    */. 
158b0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
158c0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
158d0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
158e0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
158f0 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b  t){.      int k;
15900 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15910 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
15920 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 61  _None );.      a
15930 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 75 74  ssert( pIdx->aut
15940 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20 20 20 20  oIndex );.      
15950 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
15960 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
15970 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   );..      if( p
15980 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49  Idx->nColumn!=pI
15990 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20  ndex->nColumn ) 
159a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
159b0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d  for(k=0; k<pIdx-
159c0 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a  >nColumn; k++){.
159d0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
159e0 61 72 20 2a 7a 31 20 3d 20 70 49 64 78 2d 3e 61  ar *z1 = pIdx->a
159f0 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
15a00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
15a10 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
15a20 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[k];.        if
15a30 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
15a40 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43  [k]!=pIndex->aiC
15a50 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b  olumn[k] ) break
15a60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
15a70 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b  dx->aSortOrder[k
15a80 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74  ]!=pIndex->aSort
15a90 4f 72 64 65 72 5b 6b 5d 20 29 20 62 72 65 61 6b  Order[k] ) break
15aa0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 31  ;.        if( z1
15ab0 21 3d 7a 32 20 26 26 20 73 71 6c 69 74 65 33 53  !=z2 && sqlite3S
15ac0 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29  trICmp(z1, z2) )
15ad0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
15ae0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64        if( k==pId
15af0 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
15b00 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
15b10 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d  onError!=pIndex-
15b20 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  >onError ){.    
15b30 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
15b40 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73  nstraint creates
15b50 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20   the same index 
15b60 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  as a previous.  
15b70 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
15b80 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20  raint specified 
15b90 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65  somewhere in the
15ba0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
15bb0 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20  atement..       
15bc0 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68     ** However th
15bd0 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  e ON CONFLICT cl
15be0 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72  auses are differ
15bf0 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69  ent. If both thi
15c00 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
15c10 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
15c20 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69  he previous equi
15c30 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e  valent constrain
15c40 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a  t have explicit.
15c50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20            ** ON 
15c60 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
15c70 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f   this is an erro
15c80 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  r. Otherwise, us
15c90 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  e the.          
15ca0 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  ** explicitly sp
15cb0 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 75  ecified behaviou
15cc0 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  r for the index.
15cd0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
15ce0 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49          if( !(pI
15cf0 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
15d00 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65  Default || pInde
15d10 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
15d20 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20  efault) ){.     
15d30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
15d40 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d60 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20  "conflicting ON 
15d70 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
15d80 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b   specified", 0);
15d90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15da0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
15db0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
15dc0 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
15dd0 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f      pIdx->onErro
15de0 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  r = pIndex->onEr
15df0 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ror;.          }
15e00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15e10 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
15e20 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
15e30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
15e40 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
15e50 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
15e60 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
15e70 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
15e80 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
15e90 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
15ea0 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  . .  */.  if( db
15eb0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
15ec0 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
15ed0 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
15ee0 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e  Insert(&pIndex->
15ef0 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
15f00 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
15f10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
15f20 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 71 6c 69  dex->zName, sqli
15f30 74 65 33 53 74 72 6c 65 6e 33 30 28 70 49 6e 64  te3Strlen30(pInd
15f40 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 0a 20 20  ex->zName)+1,.  
15f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f60 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 29 3b          pIndex);
15f70 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
15f80 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
15f90 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
15fa0 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
15fb0 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 64 62  iled */.      db
15fc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
15fd0 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   1;.      goto e
15fe0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
15ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
16000 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
16010 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
16020 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21     if( pTblName!
16030 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  =0 ){.      pInd
16040 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69  ex->tnum = db->i
16050 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20  nit.newTnum;.   
16060 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
16070 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
16080 79 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61  y is 0 then crea
16090 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  te the index on 
160a0 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  disk.  This.  **
160b0 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e   involves writin
160c0 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  g the index into
160d0 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
160e0 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e  e and filling in
160f0 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
16100 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
16110 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e   table contents.
16120 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64  .  **.  ** The d
16130 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
16140 30 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  0 when the user 
16150 66 69 72 73 74 20 65 6e 74 65 72 73 20 61 20 43  first enters a C
16160 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a  REATE INDEX .  *
16170 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e  * command.  db->
16180 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 77  init.busy is 1 w
16190 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 69  hen a database i
161a0 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20  s opened and .  
161b0 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  ** CREATE INDEX 
161c0 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72  statements are r
161d0 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ead out of the m
161e0 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e  aster table.  In
161f0 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72  .  ** the latter
16200 20 63 61 73 65 20 74 68 65 20 69 6e 64 65 78 20   case the index 
16210 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 6f  already exists o
16220 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73  n disk, which is
16230 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e   why.  ** we don
16240 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65  't want to recre
16250 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a  ate it..  **.  *
16260 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  * If pTblName==0
16270 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69   it means this i
16280 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65  ndex is generate
16290 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b  d as a primary k
162a0 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55  ey.  ** or UNIQU
162b0 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  E constraint of 
162c0 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
162d0 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65  tatement.  Since
162e0 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20   the table.  ** 
162f0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
16300 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69  eated, it contai
16310 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74  ns no data and t
16320 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c  he index initial
16330 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65  ization.  ** ste
16340 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64  p can be skipped
16350 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
16360 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
16370 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =0 ){.    Vdbe *
16380 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  v;.    char *zSt
16390 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d  mt;.    int iMem
163a0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
163b0 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  m;..    v = sqli
163c0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
163d0 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
163e0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
163f0 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20  ate_index;...   
16400 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72   /* Create the r
16410 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20  ootpage for the 
16420 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20  index.    */.   
16430 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
16440 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
16450 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
16460 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16470 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49  p2(v, OP_CreateI
16480 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29  ndex, iDb, iMem)
16490 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72  ;..    /* Gather
164a0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
164b0 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
164c0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
164d0 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65   into.    ** the
164e0 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a   zStmt variable.
164f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
16500 53 74 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b  Start && pEnd ){
16510 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65  .      /* A name
16520 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20  d index with an 
16530 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20  explicit CREATE 
16540 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
16550 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
16560 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
16570 64 62 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e  db, "CREATE%s IN
16580 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20  DEX %.*s",.     
16590 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e     onError==OE_N
165a0 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49  one ? "" : " UNI
165b0 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20 70 45  QUE",.        pE
165c0 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a  nd->z - pName->z
165d0 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e   + 1,.        pN
165e0 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c  ame->z);.    }el
165f0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
16600 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
16610 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49  created by a PRI
16620 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
16630 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
16640 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20  .      /* zStmt 
16650 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
16660 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a  (""); */.      z
16670 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
16680 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65  .    /* Add an e
16690 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ntry in sqlite_m
166a0 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69  aster for this i
166b0 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
166c0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
166d0 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
166e0 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
166f0 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69   %Q.%s VALUES('i
16700 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c  ndex',%Q,%Q,#%d,
16710 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64  %Q);",.        d
16720 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
16730 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
16740 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49  iDb),.        pI
16750 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  ndex->zName,.   
16760 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
16770 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a  ,.        iMem,.
16780 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20          zStmt.  
16790 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
167a0 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
167b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20  );..    /* Fill 
167c0 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64  the index with d
167d0 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20  ata and reparse 
167e0 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65  the schema. Code
167f0 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20   an OP_Expire.  
16800 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61    ** to invalida
16810 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69  te all pre-compi
16820 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
16830 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
16840 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  TblName ){.     
16850 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
16860 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
16870 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ex, iMem);.     
16880 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
16890 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
168a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
168b0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
168c0 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
168d0 62 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  b, 0, 0,.       
168e0 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
168f0 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 22  (db, "name='%q'"
16900 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  , pIndex->zName)
16910 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
16920 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16930 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70  AddOp1(v, OP_Exp
16940 69 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ire, 0);.    }. 
16950 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
16960 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
16970 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
16980 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
16990 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
169a0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
169b0 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
169c0 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
169d0 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
169e0 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
169f0 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
16a00 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
16a10 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44  operation of UPD
16a20 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53  ATE.  ** and INS
16a30 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ERT..  */.  if( 
16a40 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
16a50 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a   pTblName==0 ){.
16a60 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21      if( onError!
16a70 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70  =OE_Replace || p
16a80 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Tab->pIndex==0. 
16a90 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d          || pTab-
16aa0 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  >pIndex->onError
16ab0 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20  ==OE_Replace){. 
16ac0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
16ad0 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  xt = pTab->pInde
16ae0 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70  x;.      pTab->p
16af0 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
16b00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16b10 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d   Index *pOther =
16b20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
16b30 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68       while( pOth
16b40 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74  er->pNext && pOt
16b50 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72  her->pNext->onEr
16b60 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
16b70 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65  ){.        pOthe
16b80 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  r = pOther->pNex
16b90 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
16ba0 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
16bb0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
16bc0 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e        pOther->pN
16bd0 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  ext = pIndex;.  
16be0 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d    }.    pIndex =
16bf0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c   0;.  }..  /* Cl
16c00 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
16c10 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
16c20 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66  eate_index:.  if
16c30 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
16c40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e  sqlite3_free(pIn
16c50 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  dex->zColAff);. 
16c60 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16c70 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
16c80 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  }.  sqlite3ExprL
16c90 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
16ca0 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
16cb0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
16cc0 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71   pTblName);.  sq
16cd0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16ce0 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
16cf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
16d00 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65  ate code to make
16d10 20 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 66   sure the file f
16d20 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 73 20  ormat number is 
16d30 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 6f 72 6d  at least minForm
16d40 61 74 2e 0a 2a 2a 20 54 68 65 20 67 65 6e 65 72  at..** The gener
16d50 61 74 65 64 20 63 6f 64 65 20 77 69 6c 6c 20 69  ated code will i
16d60 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65  ncrease the file
16d70 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69   format number i
16d80 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
16d90 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 69 6e 69  void sqlite3Mini
16da0 6d 75 6d 46 69 6c 65 46 6f 72 6d 61 74 28 50 61  mumFileFormat(Pa
16db0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
16dc0 20 69 44 62 2c 20 69 6e 74 20 6d 69 6e 46 6f 72   iDb, int minFor
16dd0 6d 61 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  mat){.  Vdbe *v;
16de0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
16df0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
16e00 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69 6e   if( v ){.    in
16e10 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
16e20 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
16e30 3b 0a 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73  ;.    int r2 = s
16e40 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
16e50 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 6e  (pParse);.    in
16e60 74 20 6a 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  t j1;.    sqlite
16e70 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16e80 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44  P_ReadCookie, iD
16e90 62 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 73  b, r1, 1);.    s
16ea0 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
16eb0 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ree(v, iDb);.   
16ec0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16ed0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
16ee0 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 72 32 29  , minFormat, r2)
16ef0 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74  ;.    j1 = sqlit
16f00 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16f10 4f 50 5f 47 65 2c 20 72 32 2c 20 30 2c 20 72 31  OP_Ge, r2, 0, r1
16f20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16f30 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
16f40 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31  etCookie, iDb, 1
16f50 2c 20 72 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  , r2);.    sqlit
16f60 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
16f70 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , j1);.    sqlit
16f80 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16f90 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
16fa0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
16fb0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
16fc0 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  r2);.  }.}../*.*
16fd0 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78  * Fill the Index
16fe0 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61  .aiRowEst[] arra
16ff0 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69  y with default i
17000 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66  nformation - inf
17010 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  ormation.** to b
17020 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68  e used when we h
17030 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20  ave not run the 
17040 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
17050 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b  .**.** aiRowEst[
17060 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f  0] is suppose to
17070 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
17080 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
17090 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  in the index..**
170a0 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   Since we do not
170b0 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d   know, guess 1 m
170c0 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73  illion.  aiRowEs
170d0 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[1] is an estim
170e0 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  ate of the.** nu
170f0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
17100 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d  the table that m
17110 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
17120 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65  lar value of the
17130 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  .** first column
17140 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
17150 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61  aiRowEst[2] is a
17160 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
17170 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72  e number.** of r
17180 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  ows that match a
17190 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f  ny particular co
171a0 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68  mbiniation of th
171b0 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e  e first 2 column
171c0 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65  s.** of the inde
171d0 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  x.  And so forth
171e0 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79  .  It must alway
171f0 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  s be the case th
17200 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  at.*.**         
17210 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61    aiRowEst[N]<=a
17220 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20  iRowEst[N-1].** 
17230 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
17240 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41  st[N]>=1.**.** A
17250 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20  part from that, 
17260 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74  we have little t
17270 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20  o go on besides 
17280 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a  intuition as to.
17290 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b  ** how aiRowEst[
172a0 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  ] should be init
172b0 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75  ialized.  The nu
172c0 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20  mbers generated 
172d0 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65  here.** are base
172e0 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c  d on typical val
172f0 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74  ues found in act
17300 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a  ual indices..*/.
17310 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61  void sqlite3Defa
17320 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20  ultRowEst(Index 
17330 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e  *pIdx){.  unsign
17340 65 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69  ed *a = pIdx->ai
17350 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b  RowEst;.  int i;
17360 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d 30 20  .  assert( a!=0 
17370 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30 30  );.  a[0] = 1000
17380 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64  000;.  for(i=pId
17390 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 35  x->nColumn; i>=5
173a0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d  ; i--){.    a[i]
173b0 20 3d 20 35 3b 0a 20 20 7d 0a 20 20 77 68 69 6c   = 5;.  }.  whil
173c0 65 28 20 69 3e 3d 31 20 29 7b 0a 20 20 20 20 61  e( i>=1 ){.    a
173d0 5b 69 5d 20 3d 20 31 31 20 2d 20 69 3b 0a 20 20  [i] = 11 - i;.  
173e0 20 20 69 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28    i--;.  }.  if(
173f0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
17400 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61  OE_None ){.    a
17410 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20  [pIdx->nColumn] 
17420 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
17430 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
17440 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73  ill drop an exis
17450 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78  ting named index
17460 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
17470 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
17480 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  e DROP INDEX sta
17490 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
174a0 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
174b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
174c0 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
174d0 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20  int ifExists){. 
174e0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
174f0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
17500 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
17510 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
17520 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
17530 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
17540 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
17550 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
17560 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73  index;.  }.  ass
17570 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
17580 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ==1 );.  if( SQL
17590 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
175a0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
175b0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
175c0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
175d0 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
175e0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
175f0 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
17600 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
17610 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
17620 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
17630 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73  .    if( !ifExis
17640 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts ){.      sqli
17650 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
17660 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
17670 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  ex: %S", pName, 
17680 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  0);.    }.    pP
17690 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
176a0 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
176b0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
176c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
176d0 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a  x->autoIndex ){.
176e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
176f0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
17700 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
17710 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20  th UNIQUE ".    
17720 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45    "or PRIMARY KE
17730 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Y constraint can
17740 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
17750 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
17760 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
17770 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
17780 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
17790 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  db, pIndex->pSch
177a0 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ema);.#ifndef SQ
177b0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
177c0 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
177d0 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  int code = SQLIT
177e0 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20  E_DROP_INDEX;.  
177f0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
17800 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a  pIndex->pTable;.
17810 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
17820 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
17830 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  b].zName;.    co
17840 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
17850 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
17860 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  b);.    if( sqli
17870 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
17880 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
17890 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
178a0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
178b0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
178c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
178d0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
178e0 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49  Db ) code = SQLI
178f0 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
17900 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
17910 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
17920 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65  rse, code, pInde
17930 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  x->zName, pTab->
17940 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
17950 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
17960 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
17970 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
17980 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
17990 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
179a0 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
179b0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
179c0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
179d0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
179e0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
179f0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
17a00 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
17a10 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   1, iDb);.    sq
17a20 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
17a30 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
17a40 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
17a50 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  %s WHERE name=%Q
17a60 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
17a70 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
17a80 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
17a90 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  .       pIndex->
17aa0 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
17ab0 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
17ac0 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74  Table(db, "sqlit
17ad0 65 5f 73 74 61 74 31 22 2c 20 64 62 2d 3e 61 44  e_stat1", db->aD
17ae0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b  b[iDb].zName) ){
17af0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
17b00 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
17b10 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  ,.        "DELET
17b20 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65  E FROM %Q.sqlite
17b30 5f 73 74 61 74 31 20 57 48 45 52 45 20 69 64 78  _stat1 WHERE idx
17b40 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 64 62  =%Q",.        db
17b50 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
17b60 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a  , pIndex->zName.
17b70 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
17b80 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
17b90 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
17ba0 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79  Db);.    destroy
17bb0 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
17bc0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69   pIndex->tnum, i
17bd0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
17be0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
17bf0 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c  _DropIndex, iDb,
17c00 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a   0, 0, pIndex->z
17c10 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65  Name, 0);.  }..e
17c20 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a  xit_drop_index:.
17c30 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
17c40 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
17c50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72  );.}../*.** pArr
17c60 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ay is a pointer 
17c70 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f  to an array of o
17c80 62 6a 65 63 74 73 2e 20 20 45 61 63 68 20 6f 62  bjects.  Each ob
17c90 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61  ject in the.** a
17ca0 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20  rray is szEntry 
17cb0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 20  bytes in size.  
17cc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c  This routine all
17cd0 6f 63 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20  ocates a new.** 
17ce0 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65 20 65 6e  object on the en
17cf0 64 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e 0a  d of the array..
17d00 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79 20 69  **.** *pnEntry i
17d10 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
17d20 65 6e 74 72 69 65 73 20 61 6c 72 65 61 64 79 20  entries already 
17d30 69 6e 20 75 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f  in use.  *pnAllo
17d40 63 20 69 73 0a 2a 2a 20 74 68 65 20 70 72 65 76  c is.** the prev
17d50 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
17d60 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
17d70 61 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73  ay.  initSize is
17d80 20 74 68 65 0a 2a 2a 20 73 75 67 67 65 73 74 65   the.** suggeste
17d90 64 20 69 6e 69 74 69 61 6c 20 61 72 72 61 79 20  d initial array 
17da0 73 69 7a 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  size allocation.
17db0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  .**.** The index
17dc0 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72   of the new entr
17dd0 79 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  y is returned in
17de0 20 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pIdx..**.** Th
17df0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
17e00 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
17e10 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 62 6a  the array of obj
17e20 65 63 74 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  ects.  This.** m
17e30 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65  ight be the same
17e40 20 61 73 20 74 68 65 20 70 41 72 72 61 79 20 70   as the pArray p
17e50 61 72 61 6d 65 74 65 72 20 6f 72 20 69 74 20 6d  arameter or it m
17e60 69 67 68 74 20 62 65 20 61 20 64 69 66 66 65 72  ight be a differ
17e70 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69  ent.** pointer i
17e80 66 20 74 68 65 20 61 72 72 61 79 20 77 61 73 20  f the array was 
17e90 72 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64  resized..*/.void
17ea0 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c   *sqlite3ArrayAl
17eb0 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65  locate(.  sqlite
17ec0 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43  3 *db,      /* C
17ed0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
17ee0 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61  ify of malloc fa
17ef0 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64  ilures */.  void
17f00 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a   *pArray,     /*
17f10 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   Array of object
17f20 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61  s.  Might be rea
17f30 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e  llocated */.  in
17f40 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20  t szEntry,      
17f50 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20  /* Size of each 
17f60 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72  object in the ar
17f70 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 69  ray */.  int ini
17f80 74 53 69 7a 65 2c 20 20 20 20 20 2f 2a 20 53 75  tSize,     /* Su
17f90 67 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c 20  ggested initial 
17fa0 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65  allocation, in e
17fb0 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
17fc0 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f   *pnEntry,     /
17fd0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  * Number of obje
17fe0 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  cts currently in
17ff0 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   use */.  int *p
18000 6e 41 6c 6c 6f 63 2c 20 20 20 20 20 2f 2a 20 43  nAlloc,     /* C
18010 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
18020 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69  he allocation, i
18030 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  n elements */.  
18040 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20  int *pIdx       
18050 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69    /* Write the i
18060 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c  ndex of a new sl
18070 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ot here */.){.  
18080 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 2a  char *z;.  if( *
18090 70 6e 45 6e 74 72 79 20 3e 3d 20 2a 70 6e 41 6c  pnEntry >= *pnAl
180a0 6c 6f 63 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  loc ){.    void 
180b0 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *pNew;.    int n
180c0 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53  ewSize;.    newS
180d0 69 7a 65 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29  ize = (*pnAlloc)
180e0 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20  *2 + initSize;. 
180f0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
18100 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
18110 41 72 72 61 79 2c 20 6e 65 77 53 69 7a 65 2a 73  Array, newSize*s
18120 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28  zEntry);.    if(
18130 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
18140 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20    *pIdx = -1;.  
18150 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61      return pArra
18160 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e  y;.    }.    *pn
18170 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44  Alloc = sqlite3D
18180 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
18190 70 4e 65 77 29 2f 73 7a 45 6e 74 72 79 3b 0a 20  pNew)/szEntry;. 
181a0 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77     pArray = pNew
181b0 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61  ;.  }.  z = (cha
181c0 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d  r*)pArray;.  mem
181d0 73 65 74 28 26 7a 5b 2a 70 6e 45 6e 74 72 79 20  set(&z[*pnEntry 
181e0 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73  * szEntry], 0, s
181f0 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78  zEntry);.  *pIdx
18200 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 2b   = *pnEntry;.  +
18210 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74  +*pnEntry;.  ret
18220 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f  urn pArray;.}../
18230 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
18240 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
18250 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
18260 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
18270 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
18280 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49  e..**.** A new I
18290 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  dList is returne
182a0 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
182b0 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
182c0 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
182d0 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c  IdListAppend(sql
182e0 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
182f0 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
18300 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69  pToken){.  int i
18310 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
18320 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
18330 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
18340 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49  ero(db, sizeof(I
18350 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
18360 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
18370 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
18380 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ->nAlloc = 0;.  
18390 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73  }.  pList->a = s
183a0 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
183b0 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20  ate(.      db,. 
183c0 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20       pList->a,. 
183d0 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73       sizeof(pLis
183e0 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20  t->a[0]),.      
183f0 35 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d  5,.      &pList-
18400 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 70 4c 69  >nId,.      &pLi
18410 73 74 2d 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20  st->nAlloc,.    
18420 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20    &i.  );.  if( 
18430 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  i<0 ){.    sqlit
18440 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
18450 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  b, pList);.    r
18460 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
18470 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
18480 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
18490 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
184a0 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  en);.  return pL
184b0 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ist;.}../*.** De
184c0 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
184d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
184e0 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  dListDelete(sqli
184f0 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
18500 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
18510 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
18520 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
18530 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
18540 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
18550 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
18560 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
18570 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
18580 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
18590 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
185a0 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
185b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
185c0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
185d0 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
185e0 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
185f0 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
18600 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
18610 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
18620 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
18630 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
18640 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
18650 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
18660 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
18670 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
18680 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
18690 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
186a0 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
186b0 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
186c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
186d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
186e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64  .}../*.** Expand
186f0 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
18700 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76  ated for the giv
18710 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63  en SrcList objec
18720 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67  t by.** creating
18730 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74   nExtra new slot
18740 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69  s beginning at i
18750 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69  Start.  iStart i
18760 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a  s zero based..**
18770 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a   New slots are z
18780 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  eroed..**.** For
18790 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73   example, suppos
187a0 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74  e a SrcList init
187b0 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74  ially contains t
187c0 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e  wo entries: A,B.
187d0 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20  .** To append 3 
187e0 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f  new entries onto
187f0 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69   the end, do thi
18800 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69  s:.**.**    sqli
18810 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
18820 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20  e(db, pSrclist, 
18830 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74  3, 2);.**.** Aft
18840 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  er the call abov
18850 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61  e it would conta
18860 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20  in:  A, B, nil, 
18870 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20  nil, nil..** If 
18880 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d  the iStart argum
18890 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69  ent had been 1 i
188a0 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65  nstead of 2, the
188b0 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  n the result.** 
188c0 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a  would have been:
188d0 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e    A, nil, nil, n
188e0 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65  il, B.  To prepe
188f0 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73  nd the new slots
18900 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20  ,.** the iStart 
18910 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30  value would be 0
18920 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68  .  The result th
18930 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20  en would.** be: 
18940 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41  nil, nil, nil, A
18950 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  , B..**.** If a 
18960 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
18970 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c  n fails the SrcL
18980 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ist is unchanged
18990 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61  .  The.** db->ma
189a0 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
189b0 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74  will be set to t
189c0 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  rue..*/.SrcList 
189d0 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45  *sqlite3SrcListE
189e0 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65  nlarge(.  sqlite
189f0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20  3 *db,       /* 
18a00 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
18a10 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
18a20 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20   OOM errors */. 
18a30 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
18a40 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69      /* The SrcLi
18a50 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65  st to be enlarge
18a60 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  d */.  int nExtr
18a70 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  a,        /* Num
18a80 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73  ber of new slots
18a90 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d   to add to pSrc-
18aa0 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53  >a[] */.  int iS
18ab0 74 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20  tart         /* 
18ac0 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61  Index in pSrc->a
18ad0 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20  [] of first new 
18ae0 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  slot */.){.  int
18af0 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   i;..  /* Sanity
18b00 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c   checking on cal
18b10 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  ling parameters 
18b20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
18b30 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  art>=0 );.  asse
18b40 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b  rt( nExtra>=1 );
18b50 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 7c  .  if( pSrc==0 |
18b60 7c 20 69 53 74 61 72 74 3e 70 53 72 63 2d 3e 6e  | iStart>pSrc->n
18b70 53 72 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Src ){.    asser
18b80 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
18b90 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
18ba0 6e 20 70 53 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  n pSrc;.  }..  /
18bb0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74  * Allocate addit
18bc0 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e  ional space if n
18bd0 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  eeded */.  if( p
18be0 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
18bf0 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  >pSrc->nAlloc ){
18c00 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  .    SrcList *pN
18c10 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c  ew;.    int nAll
18c20 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2b  oc = pSrc->nSrc+
18c30 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 6e 74 20  nExtra;.    int 
18c40 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d  nGot;.    pNew =
18c50 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
18c60 63 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20 20  c(db, pSrc,.    
18c70 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
18c80 66 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c  f(*pSrc) + (nAll
18c90 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53 72  oc-1)*sizeof(pSr
18ca0 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  c->a[0]) );.    
18cb0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
18cc0 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
18cd0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
18ce0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 53  .      return pS
18cf0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  rc;.    }.    pS
18d00 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e  rc = pNew;.    n
18d10 47 6f 74 20 3d 20 28 73 71 6c 69 74 65 33 44 62  Got = (sqlite3Db
18d20 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70  MallocSize(db, p
18d30 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70  New) - sizeof(*p
18d40 53 72 63 29 29 2f 73 69 7a 65 6f 66 28 70 53 72  Src))/sizeof(pSr
18d50 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20  c->a[0])+1;.    
18d60 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28  pSrc->nAlloc = (
18d70 75 31 36 29 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20  u16)nGot;.  }.. 
18d80 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e   /* Move existin
18d90 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d  g slots that com
18da0 65 20 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c  e after the newl
18db0 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73  y inserted slots
18dc0 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65  .  ** out of the
18dd0 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d   way */.  for(i=
18de0 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e  pSrc->nSrc-1; i>
18df0 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20  =iStart; i--){. 
18e00 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78     pSrc->a[i+nEx
18e10 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69  tra] = pSrc->a[i
18e20 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e  ];.  }.  pSrc->n
18e30 53 72 63 20 2b 3d 20 28 69 31 36 29 6e 45 78 74  Src += (i16)nExt
18e40 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74  ra;..  /* Zero t
18e50 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  he newly allocat
18e60 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65  ed slots */.  me
18e70 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53  mset(&pSrc->a[iS
18e80 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  tart], 0, sizeof
18e90 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78  (pSrc->a[0])*nEx
18ea0 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53  tra);.  for(i=iS
18eb0 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e  tart; i<iStart+n
18ec0 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20  Extra; i++){.   
18ed0 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72   pSrc->a[i].iCur
18ee0 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  sor = -1;.  }.. 
18ef0 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69   /* Return a poi
18f00 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61  nter to the enla
18f10 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a  rged SrcList */.
18f20 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d    return pSrc;.}
18f30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  .../*.** Append 
18f40 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  a new table name
18f50 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72   to the given Sr
18f60 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  cList.  Create a
18f70 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a   new SrcList if.
18f80 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e  ** need be.  A n
18f90 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61  ew entry is crea
18fa0 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69  ted in the SrcLi
18fb0 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65  st even if pToke
18fc0 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n is NULL..**.**
18fd0 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72 65   A SrcList is re
18fe0 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
18ff0 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
19000 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20 72  OM error.  The r
19010 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69  eturned.** SrcLi
19020 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  st might be the 
19030 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c  same as the SrcL
19040 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e 70  ist that was inp
19050 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62  ut or it might b
19060 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20  e.** a new one. 
19070 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
19080 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68   does occurs, th
19090 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c  en the prior val
190a0 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74  ue of pList.** t
190b0 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20  hat is input to 
190c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
190d0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72  automatically fr
190e0 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  eed..**.** If pD
190f0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
19100 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
19110 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
19120 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
19130 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
19140 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
19150 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
19160 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
19170 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
19180 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
19190 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
191a0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
191b0 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
191c0 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
191d0 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
191e0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
191f0 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
19200 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
19210 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
19220 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
19230 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
19240 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
19250 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
19260 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
19270 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
19280 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
19290 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
192a0 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
192b0 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
192c0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
192d0 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
192e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
192f0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
19300 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a  pend(D,A,B,0);.*
19310 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61  *.** Then B is a
19320 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
19330 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
19340 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64  e is unspecified
19350 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20  .  If called.** 
19360 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
19370 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19380 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
19390 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,C);.**.** Th
193a0 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c  en C is the tabl
193b0 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20  e name and B is 
193c0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
193d0 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  e..*/.SrcList *s
193e0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
193f0 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  end(.  sqlite3 *
19400 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  db,        /* Co
19410 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
19420 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69  fy of malloc fai
19430 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69  lures */.  SrcLi
19440 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
19450 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73  * Append to this
19460 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63   SrcList. NULL c
19470 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63  reates a new Src
19480 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  List */.  Token 
19490 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a  *pTable,      /*
194a0 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64   Table to append
194b0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
194c0 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74  tabase    /* Dat
194d0 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62  abase of the tab
194e0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  le */.){.  struc
194f0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
19500 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
19510 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
19520 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
19530 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
19540 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a  eof(SrcList) );.
19550 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
19560 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
19570 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
19580 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20   1;.  }.  pList 
19590 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
195a0 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73  Enlarge(db, pLis
195b0 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72  t, 1, pList->nSr
195c0 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  c);.  if( db->ma
195d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
195e0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
195f0 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
19600 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
19610 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
19620 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
19630 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70  nSrc-1];.  if( p
19640 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
19650 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
19660 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
19670 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
19680 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20  abase && pTable 
19690 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
196a0 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
196b0 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
196c0 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
196d0 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
196e0 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  .  pItem->zName 
196f0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
19700 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
19710 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61  e);.  pItem->zDa
19720 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
19730 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
19740 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
19750 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
19760 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64  ./*.** Assign Vd
19770 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e  beCursor index n
19780 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61  umbers to all ta
19790 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
197a0 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
197b0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
197c0 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
197d0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
197e0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
197f0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
19800 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
19810 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70  ssert(pList || p
19820 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
19830 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
19840 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
19850 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
19860 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
19870 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
19880 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
19890 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30  Item->iCursor>=0
198a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
198b0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
198c0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
198d0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
198e0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
198f0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
19900 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
19910 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
19920 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a  pSelect->pSrc);.
19930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19940 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
19950 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
19960 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
19970 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
19980 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
19990 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
199a0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
199b0 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
199c0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
199d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
199e0 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
199f0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
19a00 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
19a10 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
19a20 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
19a30 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
19a40 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
19a50 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
19a60 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
19a70 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
19a80 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
19a90 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
19aa0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
19ab0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
19ac0 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29  , pItem->zIndex)
19ad0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
19ae0 65 74 65 54 61 62 6c 65 28 70 49 74 65 6d 2d 3e  eteTable(pItem->
19af0 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
19b00 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
19b10 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  b, pItem->pSelec
19b20 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
19b30 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
19b40 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73  tem->pOn);.    s
19b50 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
19b60 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55  te(db, pItem->pU
19b70 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sing);.  }.  sql
19b80 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
19b90 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
19ba0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
19bb0 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
19bc0 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65  rser to add a ne
19bd0 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a  w term to the.**
19be0 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e   end of a growin
19bf0 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  g FROM clause.  
19c00 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  The "p" paramete
19c10 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f 66  r is the part of
19c20 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
19c30 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  use that has alr
19c40 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72  eady been constr
19c50 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e  ucted.  "p" is N
19c60 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69  ULL.** if this i
19c70 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
19c80 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
19c90 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64  use.  pTable and
19ca0 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72   pDatabase.** ar
19cb0 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
19cc0 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61  e table and data
19cd0 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  base named in th
19ce0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
19cf0 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  rm..** pDatabase
19d00 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
19d10 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75  database name qu
19d20 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73 69  alifier is missi
19d30 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61  ng - the.** usua
19d40 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65 20  l case.  If the 
19d50 74 65 72 6d 20 68 61 73 20 61 20 61 6c 69 61 73  term has a alias
19d60 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70 6f  , then pAlias po
19d70 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61  ints to the.** a
19d80 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20  lias token.  If 
19d90 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73 75  the term is a su
19da0 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53 75  bquery, then pSu
19db0 62 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a 2a  bquery is the.**
19dc0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
19dd0 74 20 74 68 61 74 20 74 68 65 20 73 75 62 71 75  t that the subqu
19de0 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54 68  ery encodes.  Th
19df0 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20  e pTable and.** 
19e00 70 44 61 74 61 62 61 73 65 20 70 61 72 61 6d 65  pDatabase parame
19e10 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f  ters are NULL fo
19e20 72 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54  r subqueries.  T
19e30 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e  he pOn and pUsin
19e40 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20  g.** parameters 
19e50 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  are the content 
19e60 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  of the ON and US
19e70 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ING clauses..**.
19e80 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20  ** Return a new 
19e90 53 72 63 4c 69 73 74 20 77 68 69 63 68 20 65 6e  SrcList which en
19ea0 63 6f 64 65 73 20 69 73 20 74 68 65 20 46 52 4f  codes is the FRO
19eb0 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a 2a  M with the new.*
19ec0 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f  * term added..*/
19ed0 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
19ee0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
19ef0 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  omTerm(.  Parse 
19f00 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
19f10 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
19f20 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
19f30 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
19f40 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70 61    /* The left pa
19f50 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rt of the FROM c
19f60 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 73 65  lause already se
19f70 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
19f80 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
19f90 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
19fa0 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20 74  able to add to t
19fb0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
19fc0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61  /.  Token *pData
19fd0 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e  base,       /* N
19fe0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
19ff0 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  ase containing p
1a000 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  Table */.  Token
1a010 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20 20   *pAlias,       
1a020 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
1a030 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
1a040 20 41 53 20 73 75 62 65 78 70 72 65 73 73 69 6f   AS subexpressio
1a050 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
1a060 53 75 62 71 75 65 72 79 2c 20 20 20 20 20 20 2f  Subquery,      /
1a070 2a 20 41 20 73 75 62 71 75 65 72 79 20 75 73 65  * A subquery use
1a080 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20  d in place of a 
1a090 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  table name */.  
1a0a0 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20  Expr *pOn,      
1a0b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
1a0c0 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  N clause of a jo
1a0d0 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  in */.  IdList *
1a0e0 70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20 20  pUsing          
1a0f0 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61  /* The USING cla
1a100 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f  use of a join */
1a110 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  .){.  struct Src
1a120 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1a130 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1a140 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1a150 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  p = sqlite3SrcLi
1a160 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20  stAppend(db, p, 
1a170 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73  pTable, pDatabas
1a180 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  e);.  if( p==0 |
1a190 7c 20 70 2d 3e 6e 53 72 63 3d 3d 30 20 29 7b 0a  | p->nSrc==0 ){.
1a1a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1a1b0 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a  elete(db, pOn);.
1a1c0 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1a1d0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69  tDelete(db, pUsi
1a1e0 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
1a1f0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1a200 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20   pSubquery);.   
1a210 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 20   return p;.  }. 
1a220 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70   pItem = &p->a[p
1a230 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28  ->nSrc-1];.  if(
1a240 20 70 41 6c 69 61 73 20 26 26 20 70 41 6c 69 61   pAlias && pAlia
1a250 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65  s->n ){.    pIte
1a260 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
1a270 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1a280 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20  (db, pAlias);.  
1a290 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  }.  pItem->pSele
1a2a0 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a  ct = pSubquery;.
1a2b0 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70    pItem->pOn = p
1a2c0 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73  On;.  pItem->pUs
1a2d0 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20  ing = pUsing;.  
1a2e0 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1a2f0 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45  ** Add an INDEXE
1a300 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45  D BY or NOT INDE
1a310 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68  XED clause to th
1a320 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
1a330 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e  added .** elemen
1a340 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d  t of the source-
1a350 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
1a360 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1a370 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
1a380 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
1a390 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  dBy(Parse *pPars
1a3a0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54  e, SrcList *p, T
1a3b0 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79  oken *pIndexedBy
1a3c0 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 65  ){.  if( pIndexe
1a3d0 64 42 79 20 26 26 20 70 20 26 26 20 70 2d 3e 6e  dBy && p && p->n
1a3e0 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 73 74 72  Src>0 ){.    str
1a3f0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1a400 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
1a410 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
1a420 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 6e  assert( pItem->n
1a430 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 26 26 20  otIndexed==0 && 
1a440 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30  pItem->zIndex==0
1a450 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   );.    if( pInd
1a460 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20  exedBy->n==1 && 
1a470 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29  !pIndexedBy->z )
1a480 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f  {.      /* A "NO
1a490 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73  T INDEXED" claus
1a4a0 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20  e was supplied. 
1a4b0 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20  See parse.y .   
1a4c0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20     ** construct 
1a4d0 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f  "indexed_opt" fo
1a4e0 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20  r details. */.  
1a4f0 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e      pItem->notIn
1a500 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  dexed = 1;.    }
1a510 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
1a520 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69  m->zIndex = sqli
1a530 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1a540 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e  (pParse->db, pIn
1a550 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a  dexedBy);.    }.
1a560 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
1a570 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20  n building up a 
1a580 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
1a590 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a  he parser, the j
1a5a0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  oin operator.** 
1a5b0 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74  is initially att
1a5c0 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
1a5d0 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20  t operand.  But 
1a5e0 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
1a5f0 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68  or.** expects th
1a600 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
1a610 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67  to be on the rig
1a620 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  ht operand.  Thi
1a630 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69  s routine.** Shi
1a640 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65  fts all join ope
1a650 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74  rators from left
1a660 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e   to right for an
1a670 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20   entire FROM.** 
1a680 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  clause..**.** Ex
1a690 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74  ample: Suppose t
1a6a0 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20  he join is like 
1a6b0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1a6c0 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20        A natural 
1a6d0 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a  cross join B.**.
1a6e0 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  ** The operator 
1a6f0 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73  is "natural cros
1a700 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20  s join".  The A 
1a710 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61  and B operands a
1a720 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  re stored.** in 
1a730 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61  p->a[0] and p->a
1a740 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c  [1], respectivel
1a750 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  y.  The parser i
1a760 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20  nitially stores 
1a770 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  the.** operator 
1a780 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f  with A.  This ro
1a790 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61  utine shifts tha
1a7a0 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20  t operator over 
1a7b0 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  to B..*/.void sq
1a7c0 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66  lite3SrcListShif
1a7d0 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73  tJoinType(SrcLis
1a7e0 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 26  t *p){.  if( p &
1a7f0 26 20 70 2d 3e 61 20 29 7b 0a 20 20 20 20 69 6e  & p->a ){.    in
1a800 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
1a810 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69  ->nSrc-1; i>0; i
1a820 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  --){.      p->a[
1a830 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d  i].jointype = p-
1a840 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  >a[i-1].jointype
1a850 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
1a860 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30  [0].jointype = 0
1a870 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ;.  }.}../*.** B
1a880 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
1a890 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
1a8a0 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e3BeginTransacti
1a8b0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1a8c0 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73  , int type){.  s
1a8d0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
1a8e0 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a  be *v;.  int i;.
1a8f0 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
1a900 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
1a910 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
1a920 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
1a930 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
1a940 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
1a950 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
1a960 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
1a970 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1a980 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
1a990 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e  NSACTION, "BEGIN
1a9a0 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
1a9b0 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  n;..  v = sqlite
1a9c0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1a9d0 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74  ;.  if( !v ) ret
1a9e0 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21  urn;.  if( type!
1a9f0 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a  =TK_DEFERRED ){.
1aa00 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
1aa10 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
1aa20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1aa30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e  ddOp2(v, OP_Tran
1aa40 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70  saction, i, (typ
1aa50 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29  e==TK_EXCLUSIVE)
1aa60 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
1aa70 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
1aa80 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v, i);.    }.  }
1aa90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1aaa0 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
1aab0 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a  ommit, 0, 0);.}.
1aac0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
1aad0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
1aae0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
1aaf0 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  tTransaction(Par
1ab00 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
1ab10 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
1ab20 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
1ab30 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
1ab40 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
1ab50 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
1ab60 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
1ab70 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1ab80 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1ab90 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
1aba0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1abb0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1abc0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
1abd0 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29   "COMMIT", 0, 0)
1abe0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20   ) return;..  v 
1abf0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1ac00 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
1ac10 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
1ac20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ac30 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
1ac40 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
1ac50 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   Rollback a tran
1ac60 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
1ac70 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54  sqlite3RollbackT
1ac80 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
1ac90 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
1aca0 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
1acb0 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72   *v;..  if( pPar
1acc0 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
1acd0 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
1ace0 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
1acf0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1ad00 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
1ad10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1ad20 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
1ad30 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1ad40 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1ad50 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
1ad60 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29  ROLLBACK", 0, 0)
1ad70 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20   ) return;..  v 
1ad80 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1ad90 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
1ada0 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
1adb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1adc0 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
1add0 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
1ade0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1adf0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
1ae00 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70  parser when it p
1ae10 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20  arses a command 
1ae20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65  to create,.** re
1ae30 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
1ae40 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69  k an SQL savepoi
1ae50 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nt. .*/.void sql
1ae60 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61  ite3Savepoint(Pa
1ae70 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1ae80 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d   op, Token *pNam
1ae90 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
1aea0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1aeb0 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
1aec0 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  >db, pName);.  i
1aed0 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
1aee0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
1aef0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1af00 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1af10 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
1af20 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63  ION.    static c
1af30 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b 5d 20  onst char *az[] 
1af40 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45  = { "BEGIN", "RE
1af50 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43  LEASE", "ROLLBAC
1af60 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  K" };.    assert
1af70 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47  ( !SAVEPOINT_BEG
1af80 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f  IN && SAVEPOINT_
1af90 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41  RELEASE==1 && SA
1afa0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1afb0 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==2 );.#endif.  
1afc0 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69    if( !v || sqli
1afd0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1afe0 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45  rse, SQLITE_SAVE
1aff0 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a  POINT, az[op], z
1b000 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  Name, 0) ){.    
1b010 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1b020 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
1b030 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1b040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1b050 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1b060 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f   OP_Savepoint, o
1b070 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20  p, 0, 0, zName, 
1b080 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
1b090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1b0a0 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74  ure the TEMP dat
1b0b0 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e  abase is open an
1b0c0 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
1b0d0 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
1b0e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
1b0f0 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79  rors.  Leave any
1b100 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
1b110 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
1b120 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
1b130 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
1b140 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70  atabase(Parse *p
1b150 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
1b160 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1b170 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44  db;.  if( db->aD
1b180 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21  b[1].pBt==0 && !
1b190 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
1b1a0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
1b1b0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1b1c0 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20  int flags = .   
1b1d0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1b1e0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20  EN_READWRITE |. 
1b1f0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1b200 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
1b210 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1b220 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a  PEN_EXCLUSIVE |.
1b230 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1b240 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
1b250 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  OSE |.          
1b260 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1b270 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  _DB;..    rc = s
1b280 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f  qlite3BtreeFacto
1b290 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 53 51 4c  ry(db, 0, 0, SQL
1b2a0 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  ITE_DEFAULT_CACH
1b2b0 45 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 0a 20  E_SIZE, flags,. 
1b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2e0 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29  &db->aDb[1].pBt)
1b2f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1b300 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b310 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1b320 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
1b330 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
1b340 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
1b350 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
1b360 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
1b370 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  ary tables");.  
1b380 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1b390 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
1b3a0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  n 1;.    }.    a
1b3b0 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67  ssert( (db->flag
1b3c0 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
1b3d0 6e 73 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 75  ns)==0 || db->au
1b3e0 74 6f 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20  toCommit );.    
1b3f0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
1b400 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
1b410 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f    sqlite3PagerJo
1b420 75 72 6e 61 6c 4d 6f 64 65 28 73 71 6c 69 74 65  urnalMode(sqlite
1b430 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e  3BtreePager(db->
1b440 61 44 62 5b 31 5d 2e 70 42 74 29 2c 0a 20 20 20  aDb[1].pBt),.   
1b450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b460 20 20 20 20 20 20 20 20 20 64 62 2d 3e 64 66 6c           db->dfl
1b470 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 29 3b 0a 20  tJournalMode);. 
1b480 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1b490 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1b4a0 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
1b4b0 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20  will verify the 
1b4c0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e  schema cookie an
1b4d0 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61  d start.** a rea
1b4e0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  d-transaction fo
1b4f0 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61  r all named data
1b500 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  base files..**.*
1b510 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  * It is importan
1b520 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d  t that all schem
1b530 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72  a cookies be ver
1b540 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a  ified and all.**
1b550 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1b560 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62 65  ns be started be
1b570 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c  fore anything el
1b580 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a  se happens in.**
1b590 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
1b5a0 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75  m.  But this rou
1b5b0 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c  tine can be call
1b5c0 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74  ed after much ot
1b5d0 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20  her.** code has 
1b5e0 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20  been generated. 
1b5f0 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61 74   So here is what
1b600 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68   we do:.**.** Th
1b610 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
1b620 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1b630 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20  led, we code an 
1b640 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20  OP_Goto that.** 
1b650 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73  will jump to a s
1b660 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65  ubroutine at the
1b670 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67   end of the prog
1b680 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a  ram.  Then we.**
1b690 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64 61   record every da
1b6a0 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65 64  tabase that need
1b6b0 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65 72  s its schema ver
1b6c0 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
1b6d0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1b6e0 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72  sk field.  Later
1b6f0 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65  , after all othe
1b700 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a  r code has been.
1b710 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68  ** generated, th
1b720 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  e subroutine tha
1b730 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69  t does the cooki
1b740 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20  e verifications 
1b750 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68  and.** starts th
1b760 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77  e transactions w
1b770 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64  ill be coded and
1b780 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20   the OP_Goto P2 
1b790 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
1b7a0 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
1b7b0 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e  o that subroutin
1b7c0 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74 69  e.  The generati
1b7d0 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f  on of the.** coo
1b7e0 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
1b7f0 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65   subroutine code
1b800 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69   happens in sqli
1b810 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
1b820 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c  )..**.** If iDb<
1b830 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20  0 then code the 
1b840 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64  OP_Goto only - d
1b850 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f  on't set flag to
1b860 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73   verify the.** s
1b870 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74  chema on any dat
1b880 61 62 61 73 65 73 2e 20 20 54 68 69 73 20 63 61  abases.  This ca
1b890 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73  n be used to pos
1b8a0 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74  ition the OP_Got
1b8b0 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68  o.** early in th
1b8c0 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77  e code, before w
1b8d0 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61  e know if any da
1b8e0 74 61 62 61 73 65 20 74 61 62 6c 65 73 20 77 69  tabase tables wi
1b8f0 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76  ll be used..*/.v
1b900 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56  oid sqlite3CodeV
1b910 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73  erifySchema(Pars
1b920 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1b930 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
1b940 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
1b950 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20   int mask;..  v 
1b960 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1b970 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
1b980 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20  v==0 ) return;  
1b990 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  /* This only hap
1b9a0 70 65 6e 73 20 69 66 20 74 68 65 72 65 20 77 61  pens if there wa
1b9b0 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  s a prior error 
1b9c0 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
1b9d0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72  ->db;.  if( pPar
1b9e0 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d  se->cookieGoto==
1b9f0 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 ){.    pParse-
1ba00 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71  >cookieGoto = sq
1ba10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ba20 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30  v, OP_Goto, 0, 0
1ba30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  )+1;.  }.  if( i
1ba40 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  Db>=0 ){.    ass
1ba50 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
1ba60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1ba70 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
1ba80 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b  !=0 || iDb==1 );
1ba90 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
1baa0 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  <SQLITE_MAX_ATTA
1bab0 43 48 45 44 2b 32 20 29 3b 0a 20 20 20 20 6d 61  CHED+2 );.    ma
1bac0 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20  sk = 1<<iDb;.   
1bad0 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 63 6f   if( (pParse->co
1bae0 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29  okieMask & mask)
1baf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
1bb00 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
1bb10 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  |= mask;.      p
1bb20 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c  Parse->cookieVal
1bb30 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44  ue[iDb] = db->aD
1bb40 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
1bb50 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20  schema_cookie;. 
1bb60 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
1bb70 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
1bb80 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1bb90 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
1bba0 73 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  se(pParse);.    
1bbb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
1bbc0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1bbd0 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
1bbe0 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
1bbf0 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
1bc00 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
1bc10 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
1bc20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1bc30 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
1bc40 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
1bc50 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
1bc60 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
1bc70 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
1bc80 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
1bc90 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
1bca0 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
1bcb0 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
1bcc0 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74  t if the setStat
1bcd0 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ement parameter 
1bce0 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
1bcf0 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
1bd00 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
1bd10 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
1bd20 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
1bd30 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
1bd40 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
1bd50 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
1bd60 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
1bd70 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
1bd80 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1bd90 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
1bda0 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
1bdb0 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
1bdc0 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
1bdd0 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
1bde0 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
1bdf0 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
1be00 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
1be10 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
1be20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
1be30 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
1be40 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
1be50 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
1be60 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   be set..*/.void
1be70 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1be80 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
1be90 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
1bea0 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74  etStatement, int
1beb0 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
1bec0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1bed0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1bee0 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
1bef0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
1bf00 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
1bf10 2c 20 69 44 62 29 3b 0a 20 20 70 50 61 72 73 65  , iDb);.  pParse
1bf20 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31  ->writeMask |= 1
1bf30 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20 73 65 74  <<iDb;.  if( set
1bf40 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 50 61  Statement && pPa
1bf50 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29  rse->nested==0 )
1bf60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1bf70 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 74  eAddOp1(v, OP_St
1bf80 61 74 65 6d 65 6e 74 2c 20 69 44 62 29 3b 0a 20  atement, iDb);. 
1bf90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63   }.}../*.** Chec
1bfa0 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64  k to see if pInd
1bfb0 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ex uses the coll
1bfc0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
1bfd0 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  Coll.  Return.**
1bfe0 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
1bff0 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74   and false if it
1c000 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69   does not..*/.#i
1c010 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c020 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
1c030 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61   int collationMa
1c040 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tch(const char *
1c050 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49  zColl, Index *pI
1c060 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  ndex){.  int i;.
1c070 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e    for(i=0; i<pIn
1c080 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  dex->nColumn; i+
1c090 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
1c0a0 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e  ar *z = pIndex->
1c0b0 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69  azColl[i];.    i
1c0c0 66 28 20 7a 3d 3d 7a 43 6f 6c 6c 20 7c 7c 20 28  f( z==zColl || (
1c0d0 7a 20 26 26 20 7a 43 6f 6c 6c 20 26 26 20 30 3d  z && zColl && 0=
1c0e0 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
1c0f0 7a 2c 20 7a 43 6f 6c 6c 29 29 20 29 7b 0a 20 20  z, zColl)) ){.  
1c100 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1c110 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1c120 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
1c130 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
1c140 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
1c150 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63  b that use the c
1c160 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1c170 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70  e pColl..** If p
1c180 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
1c190 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
1c1a0 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23  es of pTab..*/.#
1c1b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c1c0 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
1c1d0 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61  c void reindexTa
1c1e0 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
1c1f0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
1c200 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
1c210 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  l){.  Index *pIn
1c220 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
1c230 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
1c240 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
1c250 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e  ab */..  for(pIn
1c260 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  dex=pTab->pIndex
1c270 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
1c280 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b  =pIndex->pNext){
1c290 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d  .    if( zColl==
1c2a0 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61  0 || collationMa
1c2b0 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65  tch(zColl, pInde
1c2c0 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  x) ){.      int 
1c2d0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
1c2e0 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
1c2f0 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
1c300 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
1c310 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1c320 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1c330 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  0, iDb);.      s
1c340 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
1c350 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
1c360 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , -1);.    }.  }
1c370 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1c380 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
1c390 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61  ndices of all ta
1c3a0 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  bles in all data
1c3b0 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a  bases where the.
1c3c0 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74  ** indices use t
1c3d0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
1c3e0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66  uence pColl.  If
1c3f0 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
1c400 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20  ecompute.** all 
1c410 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65  indices everywhe
1c420 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  re..*/.#ifndef S
1c430 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
1c440 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
1c450 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
1c460 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1c470 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
1c480 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  ){.  Db *pDb;   
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4a0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74   /* A single dat
1c4b0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
1c4c0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
1c4d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1c4e0 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
1c4f0 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
1c500 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1c510 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
1c520 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1c530 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b  */.  HashElem *k
1c540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c550 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1c560 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
1c570 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  Db */.  Table *p
1c580 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
1c590 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
1c5a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
1c5b0 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20  /..  for(iDb=0, 
1c5c0 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62  pDb=db->aDb; iDb
1c5d0 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c  <db->nDb; iDb++,
1c5e0 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73   pDb++){.    ass
1c5f0 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20  ert( pDb!=0 );. 
1c600 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48     for(k=sqliteH
1c610 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70  ashFirst(&pDb->p
1c620 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
1c630 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ;  k; k=sqliteHa
1c640 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
1c650 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
1c660 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
1c670 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65  k);.      reinde
1c680 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
1c690 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Tab, zColl);.   
1c6a0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
1c6b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1c6c0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49  code for the REI
1c6d0 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
1c6e0 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
1c6f0 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EX              
1c700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
1c710 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   1.**        REI
1c720 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e  NDEX  <collation
1c730 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
1c740 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 2.**        R
1c750 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
1c760 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e  se>.?<tablename>
1c770 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20    -- 3.**       
1c780 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
1c790 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d  base>.?<indexnam
1c7a0 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46  e>  -- 4.**.** F
1c7b0 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c  orm 1 causes all
1c7c0 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
1c7d0 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
1c7e0 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74  es to be rebuilt
1c7f0 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75  ..** Form 2 rebu
1c800 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  ilds all indices
1c810 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
1c820 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e  s that use the n
1c830 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e  amed.** collatin
1c840 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72  g function.  For
1c850 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69  ms 3 and 4 rebui
1c860 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  ld the named ind
1c870 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64  ex or all.** ind
1c880 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
1c890 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74  with the named t
1c8a0 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
1c8b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
1c8c0 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65  NDEX.void sqlite
1c8d0 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a  3Reindex(Parse *
1c8e0 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
1c8f0 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Name1, Token *pN
1c900 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ame2){.  CollSeq
1c910 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
1c920 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
1c930 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65  g sequence to be
1c940 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e   reindexed, or N
1c950 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ULL */.  char *z
1c960 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c970 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1c980 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
1c990 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1c9a0 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
1c9b0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1c9c0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54   database */.  T
1c9d0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
1c9e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1c9f0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
1ca00 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  abase */.  Index
1ca10 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
1ca20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
1ca30 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
1ca40 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  th pTab */.  int
1ca50 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
1ca60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ca70 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
1ca80 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
1ca90 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1caa0 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
1cab0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1cac0 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f  n */.  Token *pO
1cad0 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  bjName;         
1cae0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1caf0 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
1cb00 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
1cb10 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   */..  /* Read t
1cb20 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1cb30 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
1cb40 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
1cb50 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
1cb60 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
1cb70 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
1cb80 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28  n NULL. */.  if(
1cb90 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
1cba0 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
1cbb0 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
1cbc0 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
1cbd0 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61  pName1==0 || pNa
1cbe0 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  me1->z==0 ){.   
1cbf0 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
1cc00 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20  s(pParse, 0);.  
1cc10 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
1cc20 65 20 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20  e if( pName2==0 
1cc30 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20  || pName2->z==0 
1cc40 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  ){.    char *zCo
1cc50 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ll;.    assert( 
1cc60 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20  pName1->z );.   
1cc70 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
1cc80 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
1cc90 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31  arse->db, pName1
1cca0 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  );.    if( !zCol
1ccb0 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  l ) return;.    
1ccc0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
1ccd0 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
1cce0 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 2d  NC(db), zColl, -
1ccf0 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  1, 0);.    if( p
1cd00 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Coll ){.      if
1cd10 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( zColl ){.     
1cd20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
1cd30 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  ses(pParse, zCol
1cd40 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
1cd50 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
1cd60 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oll);.      }.  
1cd70 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1cd80 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
1cd90 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
1cda0 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
1cdb0 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
1cdc0 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
1cdd0 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65  Name2, &pObjName
1cde0 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29  );.  if( iDb<0 )
1cdf0 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73   return;.  z = s
1ce00 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1ce10 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65  ken(db, pObjName
1ce20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
1ce30 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20  return;.  zDb = 
1ce40 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
1ce50 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  me;.  pTab = sql
1ce60 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
1ce70 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  , z, zDb);.  if(
1ce80 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69   pTab ){.    rei
1ce90 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
1cea0 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , pTab, 0);.    
1ceb0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1cec0 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , z);.    return
1ced0 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
1cee0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
1cef0 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  x(db, z, zDb);. 
1cf00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1cf10 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e  b, z);.  if( pIn
1cf20 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
1cf30 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1cf40 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
1cf50 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
1cf60 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
1cf70 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
1cf80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1cf90 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
1cfa0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
1cfb0 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79  able to identify
1cfc0 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62   the object to b
1cfd0 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d  e reindexed");.}
1cfe0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
1cff0 65 74 75 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c  eturn a dynamicl
1d000 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49  y allocated KeyI
1d010 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
1d020 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a  at can be used.*
1d030 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65  * with OP_OpenRe
1d040 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69  ad or OP_OpenWri
1d050 74 65 20 74 6f 20 61 63 63 65 73 73 20 64 61 74  te to access dat
1d060 61 62 61 73 65 20 69 6e 64 65 78 20 70 49 64 78  abase index pIdx
1d070 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
1d080 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72  ssful, a pointer
1d090 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 72 75   to the new stru
1d0a0 63 74 75 72 65 20 69 73 20 72 65 74 75 72 6e 65  cture is returne
1d0b0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a  d. In this case.
1d0c0 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  ** the caller is
1d0d0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1d0e0 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
1d0f0 44 62 46 72 65 65 28 64 62 2c 20 29 20 6f 6e 20  DbFree(db, ) on 
1d100 74 68 65 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a  the returned .**
1d110 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e 20   pointer. If an 
1d120 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 6f 75  error occurs (ou
1d130 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20 6d  t of memory or m
1d140 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e  issing collation
1d150 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c 20   .** sequence), 
1d160 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
1d170 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 20 6f   and the state o
1d180 66 20 70 50 61 72 73 65 20 75 70 64 61 74 65 64  f pParse updated
1d190 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20 74   to reflect.** t
1d1a0 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79  he error..*/.Key
1d1b0 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e 64  Info *sqlite3Ind
1d1c0 65 78 4b 65 79 69 6e 66 6f 28 50 61 72 73 65 20  exKeyinfo(Parse 
1d1d0 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
1d1e0 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pIdx){.  int i;.
1d1f0 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64    int nCol = pId
1d200 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e  x->nColumn;.  in
1d210 74 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f  t nBytes = sizeo
1d220 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 43  f(KeyInfo) + (nC
1d230 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f 6c  ol-1)*sizeof(Col
1d240 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a 20  lSeq*) + nCol;. 
1d250 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1d260 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79  Parse->db;.  Key
1d270 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65  Info *pKey = (Ke
1d280 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 33 44  yInfo *)sqlite3D
1d290 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
1d2a0 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28 20  nBytes);..  if( 
1d2b0 70 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65 79  pKey ){.    pKey
1d2c0 2d 3e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64  ->db = pParse->d
1d2d0 62 3b 0a 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f  b;.    pKey->aSo
1d2e0 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29  rtOrder = (u8 *)
1d2f0 26 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e 43  &(pKey->aColl[nC
1d300 6f 6c 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ol]);.    assert
1d310 28 20 26 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72  ( &pKey->aSortOr
1d320 64 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28 75  der[nCol]==&(((u
1d330 38 20 2a 29 70 4b 65 79 29 5b 6e 42 79 74 65 73  8 *)pKey)[nBytes
1d340 5d 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ]) );.    for(i=
1d350 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
1d360 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
1d370 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
1d380 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  l[i];.      asse
1d390 72 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20 20  rt( zColl );.   
1d3a0 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69     pKey->aColl[i
1d3b0 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  ] = sqlite3Locat
1d3c0 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
1d3d0 20 7a 43 6f 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20   zColl, -1);.   
1d3e0 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72     pKey->aSortOr
1d3f0 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61  der[i] = pIdx->a
1d400 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
1d410 20 20 7d 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46    }.    pKey->nF
1d420 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c  ield = (u16)nCol
1d430 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
1d440 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
1d450 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1d460 62 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b  b, pKey);.    pK
1d470 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ey = 0;.  }.  re
1d480 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a           turn pKey;.}.