/ Hex Artifact Content
Login

Artifact 7971c75fc7e31d9a0e1caea7b1b5534326a10dda23837ae1848ee72a99ddb691:


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 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e   ){.    /* A min
1c40: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73  imum of one curs
1c50: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69  or is required i
1c60: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
1c70: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53  is used.    *  S
1c80: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33  ee ticket [a6963
1c90: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20  79c1f08866] */. 
1ca0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1cb0: 65 2d 3e 70 41 69 6e 63 3d 3d 30 20 7c 7c 20 70  e->pAinc==0 || p
1cc0: 50 61 72 73 65 2d 3e 6e 54 61 62 3e 30 20 29 3b  Parse->nTab>0 );
1cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ce0: 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61  MakeReady(v, pPa
1cf0: 72 73 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  rse);.    pParse
1d00: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f  ->rc = SQLITE_DO
1d10: 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1d20: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
1d30: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1d40: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
1d50: 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65   parser and code
1d60: 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72   generator recur
1d70: 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20  sively in order 
1d80: 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  to generate.** c
1d90: 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20  ode for the SQL 
1da0: 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1db0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
1dc0: 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65  the pParse conte
1dd0: 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  xt.** currently 
1de0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1df0: 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61  on.  When the pa
1e00: 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75  rser is run recu
1e10: 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20  rsively.** this 
1e20: 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f  way, the final O
1e30: 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70  P_Halt is not ap
1e40: 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72  pended and other
1e50: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1e60: 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74  ** and finalizat
1e70: 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d  ion steps are om
1e80: 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68  itted because th
1e90: 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67  ose are handling
1ea0: 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72   by the.** outer
1eb0: 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a  most parser..**.
1ec0: 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e  ** Not everythin
1ed0: 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20  g is nestable.  
1ee0: 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73  This facility is
1ef0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72   designed to per
1f00: 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  mit.** INSERT, U
1f10: 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54  PDATE, and DELET
1f20: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61  E operations aga
1f30: 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54  inst SQLITE_MAST
1f40: 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65  ER.  Use.** care
1f50: 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74   if you decide t
1f60: 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69  o try to use thi
1f70: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f  s routine for so
1f80: 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1f90: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1fa0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61  e3NestedParse(Pa
1fb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1fc0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1fd0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1fe0: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
1ff0: 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
2000: 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Msg = 0;.  sqlit
2010: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2020: 3e 64 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65  >db;.  char save
2030: 42 75 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53  Buf[PARSE_TAIL_S
2040: 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Z];..  if( pPars
2050: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
2060: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
2070: 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b  se->nested<10 );
2080: 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f    /* Nesting sho
2090: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c  uld only be of l
20a0: 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a  imited depth */.
20b0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
20c0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20  Format);.  zSql 
20d0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
20e0: 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  f(db, zFormat, a
20f0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
2100: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
2110: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
2120: 61 6e 20 72 65 73 75 6c 74 20 65 69 74 68 65 72  an result either
2130: 20 66 72 6f 6d 20 61 6e 20 4f 4f 4d 20 6f 72 20   from an OOM or 
2140: 62 65 63 61 75 73 65 20 74 68 65 20 66 6f 72 6d  because the form
2150: 61 74 74 65 64 20 73 74 72 69 6e 67 0a 20 20 20  atted string.   
2160: 20 2a 2a 20 65 78 63 65 65 64 73 20 53 51 4c 49   ** exceeds SQLI
2170: 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 2e  TE_LIMIT_LENGTH.
2180: 20 20 49 6e 20 74 68 65 20 6c 61 74 74 65 72 20    In the latter 
2190: 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  case, we need to
21a0: 20 73 65 74 0a 20 20 20 20 2a 2a 20 61 6e 20 65   set.    ** an e
21b0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  rror */.    if( 
21c0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
21d0: 64 20 29 20 70 50 61 72 73 65 2d 3e 72 63 20 3d  d ) pParse->rc =
21e0: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3b 0a   SQLITE_TOOBIG;.
21f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2200: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
2210: 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76  ++;.  memcpy(sav
2220: 65 42 75 66 2c 20 50 41 52 53 45 5f 54 41 49 4c  eBuf, PARSE_TAIL
2230: 28 70 50 61 72 73 65 29 2c 20 50 41 52 53 45 5f  (pParse), PARSE_
2240: 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73  TAIL_SZ);.  mems
2250: 65 74 28 50 41 52 53 45 5f 54 41 49 4c 28 70 50  et(PARSE_TAIL(pP
2260: 61 72 73 65 29 2c 20 30 2c 20 50 41 52 53 45 5f  arse), 0, PARSE_
2270: 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73 71 6c 69  TAIL_SZ);.  sqli
2280: 74 65 33 52 75 6e 50 61 72 73 65 72 28 70 50 61  te3RunParser(pPa
2290: 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72  rse, zSql, &zErr
22a0: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
22b0: 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
22c0: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
22d0: 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20  ree(db, zSql);. 
22e0: 20 6d 65 6d 63 70 79 28 50 41 52 53 45 5f 54 41   memcpy(PARSE_TA
22f0: 49 4c 28 70 50 61 72 73 65 29 2c 20 73 61 76 65  IL(pParse), save
2300: 42 75 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f  Buf, PARSE_TAIL_
2310: 53 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  SZ);.  pParse->n
2320: 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20  ested--;.}..#if 
2330: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
2340: 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  ENTICATION./*.**
2350: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2360: 7a 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61  zTable is the na
2370: 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d  me of the system
2380: 20 74 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72   table that stor
2390: 65 73 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f  es the.** list o
23a0: 66 20 75 73 65 72 73 20 61 6e 64 20 74 68 65 69  f users and thei
23b0: 72 20 61 63 63 65 73 73 20 63 72 65 64 65 6e 74  r access credent
23c0: 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ials..*/.int sql
23d0: 69 74 65 33 55 73 65 72 41 75 74 68 54 61 62 6c  ite3UserAuthTabl
23e0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  e(const char *zT
23f0: 61 62 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  able){.  return 
2400: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
2410: 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f  zTable, "sqlite_
2420: 75 73 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e  user")==0;.}.#en
2430: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
2440: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
2450: 65 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  ection was opene
2460: 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
2470: 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 5f 53 43  E_OPEN_SHARED_SC
2480: 48 45 4d 41 0a 2a 2a 20 66 6c 61 67 20 73 70 65  HEMA.** flag spe
2490: 63 69 66 69 65 64 2c 20 74 68 65 6e 20 65 6e 73  cified, then ens
24a0: 75 72 65 20 74 68 61 74 20 74 68 65 20 64 61 74  ure that the dat
24b0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 66 6f 72  abase schema for
24c0: 20 64 61 74 61 62 61 73 65 20 69 44 62 0a 2a 2a   database iDb.**
24d0: 20 69 73 20 6c 6f 61 64 65 64 2e 20 45 69 74 68   is loaded. Eith
24e0: 65 72 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  er by obtaining 
24f0: 61 20 53 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  a Schema object 
2500: 66 72 6f 6d 20 74 68 65 20 73 63 68 65 6d 61 2d  from the schema-
2510: 70 6f 6f 6c 2c 20 6f 72 0a 2a 2a 20 62 79 20 72  pool, or.** by r
2520: 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
2530: 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  nts of the sqlit
2540: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
2550: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
2560: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73  abase handle was
2570: 20 6e 6f 74 20 6f 70 65 6e 65 64 20 77 69 74 68   not opened with
2580: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
2590: 52 45 44 5f 53 43 48 45 4d 41 2c 20 6f 72 0a 2a  RED_SCHEMA, or.*
25a0: 2a 20 69 66 20 74 68 65 20 73 63 68 65 6d 61 20  * if the schema 
25b0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 69 44 62  for database iDb
25c0: 20 69 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64   is already load
25d0: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
25e0: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
25f0: 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 73 20  .** Non-zero is 
2600: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 73 63  returned if a sc
2610: 68 65 6d 61 20 69 73 20 6c 6f 61 64 65 64 2c 20  hema is loaded, 
2620: 6f 72 20 7a 65 72 6f 20 69 66 20 69 74 20 77 61  or zero if it wa
2630: 73 20 61 6c 72 65 61 64 79 20 0a 2a 2a 20 6c 6f  s already .** lo
2640: 61 64 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  aded when this f
2650: 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
2660: 65 64 2e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ed...*/.int sqli
2670: 74 65 33 53 63 68 65 6d 61 4c 6f 61 64 28 73 71  te3SchemaLoad(sq
2680: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
2690: 44 62 2c 20 69 6e 74 20 2a 70 62 55 6e 6c 6f 61  Db, int *pbUnloa
26a0: 64 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 29  d, char **pzErr)
26b0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
26c0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 49 73  ITE_OK;.  if( Is
26d0: 52 65 75 73 65 53 63 68 65 6d 61 28 64 62 29 20  ReuseSchema(db) 
26e0: 0a 20 20 20 20 20 20 26 26 20 44 62 48 61 73 50  .      && DbHasP
26f0: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c  roperty(db, iDb,
2700: 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
2710: 29 3d 3d 30 20 0a 20 20 20 20 20 20 26 26 20 28  )==0 .      && (
2720: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
2730: 20 7c 7c 20 28 69 44 62 21 3d 31 20 26 26 20 64   || (iDb!=1 && d
2740: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 29 29  b->init.iDb==1))
2750: 0a 20 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  .  ){.    struct
2760: 20 73 71 6c 69 74 65 33 49 6e 69 74 49 6e 66 6f   sqlite3InitInfo
2770: 20 73 76 20 3d 20 64 62 2d 3e 69 6e 69 74 3b 0a   sv = db->init;.
2780: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e      memset(&db->
2790: 69 6e 69 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  init, 0, sizeof(
27a0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 49 6e  struct sqlite3In
27b0: 69 74 49 6e 66 6f 29 29 3b 0a 20 20 20 20 72 63  itInfo));.    rc
27c0: 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 4f 6e   = sqlite3InitOn
27d0: 65 28 64 62 2c 20 69 44 62 2c 20 70 7a 45 72 72  e(db, iDb, pzErr
27e0: 2c 20 30 29 3b 0a 20 20 20 20 64 62 2d 3e 69 6e  , 0);.    db->in
27f0: 69 74 20 3d 20 73 76 3b 0a 20 20 20 20 2a 70 62  it = sv;.    *pb
2800: 55 6e 6c 6f 61 64 20 3d 20 28 72 63 3d 3d 53 51  Unload = (rc==SQ
2810: 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 44 62 21  LITE_OK && (iDb!
2820: 3d 31 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  =1));.  }.  retu
2830: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2840: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
2850: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
2860: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
2870: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
2880: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
2890: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
28a0: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
28b0: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
28c0: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
28d0: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
28e0: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
28f0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
2900: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
2910: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
2920: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
2930: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
2940: 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68  the table and th
2950: 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68  e.** first match
2960: 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74  ing table is ret
2970: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
2980: 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61  king for duplica
2990: 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  te table.** name
29a0: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
29b0: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
29c0: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
29d0: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
29e0: 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61  .** auxiliary da
29f0: 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73  tabases added us
2a00: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
2a10: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  ommand..**.** Se
2a20: 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f  e also sqlite3Lo
2a30: 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a  cateTable()..*/.
2a40: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69  Table *sqlite3Fi
2a50: 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  ndTable(sqlite3 
2a60: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
2a70: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
2a80: 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a  ar *zDatabase){.
2a90: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a    Table *p = 0;.
2aa0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41    int i;..  /* A
2ab0: 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20 72  ll mutexes are r
2ac0: 65 71 75 69 72 65 64 20 66 6f 72 20 73 63 68 65  equired for sche
2ad0: 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65  ma access.  Make
2ae0: 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68   sure we hold th
2af0: 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  em. */.  assert(
2b00: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c   zDatabase!=0 ||
2b10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2b20: 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29  dsAllMutexes(db)
2b30: 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55   );.#if SQLITE_U
2b40: 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
2b50: 4f 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65  ON.  /* Only the
2b60: 20 61 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61   admin user is a
2b70: 6c 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74  llowed to know t
2b80: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75  hat the sqlite_u
2b90: 73 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65  ser table.  ** e
2ba0: 78 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64  xists */.  if( d
2bb0: 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65  b->auth.authLeve
2bc0: 6c 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26  l<UAUTH_Admin &&
2bd0: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
2be0: 54 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20  Table(zName)!=0 
2bf0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
2c00: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68  .  }.#endif.  wh
2c10: 69 6c 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28  ile(1){.    for(
2c20: 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69  i=OMIT_TEMPDB; i
2c30: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
2c40: 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69        int j = (i
2c50: 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20  <2) ? i^1 : i;  
2c60: 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20   /* Search TEMP 
2c70: 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20  before MAIN */. 
2c80: 20 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61       if( zDataba
2c90: 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
2ca0: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
2cb0: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44  e, db->aDb[j].zD
2cc0: 62 53 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  bSName)==0 ){.  
2cd0: 20 20 20 20 20 20 69 6e 74 20 62 55 6e 6c 6f 61        int bUnloa
2ce0: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61  d = 0;.        a
2cf0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
2d00: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
2d10: 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  , j, 0) );.     
2d20: 20 20 20 69 66 28 20 49 73 52 65 75 73 65 53 63     if( IsReuseSc
2d30: 68 65 6d 61 28 64 62 29 20 29 7b 0a 20 20 20 20  hema(db) ){.    
2d40: 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61        Parse *pPa
2d50: 72 73 65 20 3d 20 64 62 2d 3e 70 50 61 72 73 65  rse = db->pParse
2d60: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2d70: 70 50 61 72 73 65 20 26 26 20 70 50 61 72 73 65  pParse && pParse
2d80: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
2d90: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
2da0: 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 53 63 68  >rc = sqlite3Sch
2db0: 65 6d 61 4c 6f 61 64 28 64 62 2c 20 6a 2c 20 26  emaLoad(db, j, &
2dc0: 62 55 6e 6c 6f 61 64 2c 20 26 70 50 61 72 73 65  bUnload, &pParse
2dd0: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
2de0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
2df0: 73 65 2d 3e 72 63 20 29 20 70 50 61 72 73 65 2d  se->rc ) pParse-
2e00: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
2e10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2e20: 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74         p = sqlit
2e30: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
2e40: 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e  aDb[j].pSchema->
2e50: 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b  tblHash, zName);
2e60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 20 29  .        if( p )
2e70: 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 20   return p;.     
2e80: 20 20 20 69 66 28 20 62 55 6e 6c 6f 61 64 20 29     if( bUnload )
2e90: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2ea0: 74 65 33 53 63 68 65 6d 61 52 65 6c 65 61 73 65  te3SchemaRelease
2eb0: 28 64 62 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  (db, j);.       
2ec0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2ed0: 0a 20 20 20 20 2f 2a 20 4e 6f 74 20 66 6f 75 6e  .    /* Not foun
2ee0: 64 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  d.  If the name 
2ef0: 77 65 20 77 65 72 65 20 6c 6f 6f 6b 69 6e 67 20  we were looking 
2f00: 66 6f 72 20 77 61 73 20 74 65 6d 70 2e 73 71 6c  for was temp.sql
2f10: 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 20 20 2a  ite_master.    *
2f20: 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68  * then change th
2f30: 65 20 6e 61 6d 65 20 74 6f 20 73 71 6c 69 74 65  e name to sqlite
2f40: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 61 6e 64  _temp_master and
2f50: 20 74 72 79 20 61 67 61 69 6e 2e 20 2a 2f 0a 20   try again. */. 
2f60: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
2f70: 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 4d 41 53  rICmp(zName, MAS
2f80: 54 45 52 5f 4e 41 4d 45 29 21 3d 30 20 29 20 62  TER_NAME)!=0 ) b
2f90: 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71  reak;.    if( sq
2fa0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 44  lite3_stricmp(zD
2fb0: 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62  atabase, db->aDb
2fc0: 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65 29 21 3d 30  [1].zDbSName)!=0
2fd0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 4e   ) break;.    zN
2fe0: 61 6d 65 20 3d 20 54 45 4d 50 5f 4d 41 53 54 45  ame = TEMP_MASTE
2ff0: 52 5f 4e 41 4d 45 3b 0a 20 20 7d 0a 20 20 72 65  R_NAME;.  }.  re
3000: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
3010: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
3020: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
3030: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
3040: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
3050: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
3060: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
3070: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
3080: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
3090: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
30a0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
30b0: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
30c0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
30d0: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
30e0: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
30f0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
3100: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
3110: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
3120: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
3130: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
3140: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
3150: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
3160: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
3170: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
3180: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
3190: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
31a0: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
31b0: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
31c0: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
31d0: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
31e0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
31f0: 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63   context in whic
3200: 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f  h to report erro
3210: 72 73 20 2a 2f 0a 20 20 75 33 32 20 66 6c 61 67  rs */.  u32 flag
3220: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
3230: 2a 20 4c 4f 43 41 54 45 5f 56 49 45 57 20 6f 72  * LOCATE_VIEW or
3240: 20 4c 4f 43 41 54 45 5f 4e 4f 45 52 52 20 2a 2f   LOCATE_NOERR */
3250: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3260: 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  Name,     /* Nam
3270: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  e of the table w
3280: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  e are looking fo
3290: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
32a0: 72 20 2a 7a 44 62 61 73 65 20 20 20 20 20 2f 2a  r *zDbase     /*
32b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
32c0: 61 62 61 73 65 2e 20 20 4d 69 67 68 74 20 62 65  abase.  Might be
32d0: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61   NULL */.){.  Ta
32e0: 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  ble *p;.  sqlite
32f0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
3300: 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74  db;..  /* Read t
3310: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
3320: 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
3330: 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
3340: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
3350: 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
3360: 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
3370: 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28  n NULL. */.  if(
3380: 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26   (db->mDbFlags &
3390: 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e   DBFLAG_SchemaKn
33a0: 6f 77 6e 4f 6b 29 3d 3d 30 20 0a 20 20 20 26 26  ownOk)==0 .   &&
33b0: 20 21 49 73 52 65 75 73 65 53 63 68 65 6d 61 28   !IsReuseSchema(
33c0: 64 62 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45  db).   && SQLITE
33d0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
33e0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 0a 20  Schema(pParse). 
33f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
3400: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  ;.  }..  p = sql
3410: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
3420: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29  , zName, zDbase)
3430: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
3440: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3450: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
3460: 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
3470: 20 69 73 20 74 68 65 20 6e 6f 74 20 74 68 65 20   is the not the 
3480: 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  name of a table 
3490: 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63 72  in the schema cr
34a0: 65 61 74 65 64 20 75 73 69 6e 67 0a 20 20 20 20  eated using.    
34b0: 2a 2a 20 43 52 45 41 54 45 2c 20 74 68 65 6e 20  ** CREATE, then 
34c0: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
34d0: 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  it is the name o
34e0: 66 20 61 6e 20 76 69 72 74 75 61 6c 20 74 61 62  f an virtual tab
34f0: 6c 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63  le that.    ** c
3500: 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f  an be an eponymo
3510: 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  us virtual table
3520: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61  . */.    if( pPa
3530: 72 73 65 2d 3e 64 69 73 61 62 6c 65 56 74 61 62  rse->disableVtab
3540: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 6f 64  ==0 ){.      Mod
3550: 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64  ule *pMod = (Mod
3560: 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68  ule*)sqlite3Hash
3570: 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  Find(&db->aModul
3580: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
3590: 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20 26 26 20   if( pMod==0 && 
35a0: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
35b0: 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61 5f  (zName, "pragma_
35c0: 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 7)==0 ){.    
35d0: 20 20 20 20 70 4d 6f 64 20 3d 20 73 71 6c 69 74      pMod = sqlit
35e0: 65 33 50 72 61 67 6d 61 56 74 61 62 52 65 67 69  e3PragmaVtabRegi
35f0: 73 74 65 72 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  ster(db, zName);
3600: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3610: 66 28 20 70 4d 6f 64 20 29 7b 0a 20 20 20 20 20  f( pMod ){.     
3620: 20 20 20 69 66 28 20 49 73 52 65 75 73 65 53 63     if( IsReuseSc
3630: 68 65 6d 61 28 64 62 29 20 26 26 20 70 50 61 72  hema(db) && pPar
3640: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
3650: 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 75           int bDu
3660: 6d 6d 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mmy = 0;.       
3670: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
3680: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4c 6f 61  sqlite3SchemaLoa
3690: 64 28 64 62 2c 20 30 2c 20 26 62 44 75 6d 6d 79  d(db, 0, &bDummy
36a0: 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  , &pParse->zErrM
36b0: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  sg);.          i
36c0: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 20 29 20  f( pParse->rc ) 
36d0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
36e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74 61    if( sqlite3Vta
3700: 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49  bEponymousTableI
3710: 6e 69 74 28 70 50 61 72 73 65 2c 20 70 4d 6f 64  nit(pParse, pMod
3720: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
3730: 61 62 6c 65 20 2a 70 45 70 6f 54 61 62 20 3d 20  able *pEpoTab = 
3740: 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 3b 0a 20  pMod->pEpoTab;. 
3750: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
3760: 20 49 73 52 65 75 73 65 53 63 68 65 6d 61 28 64   IsReuseSchema(d
3770: 62 29 20 7c 7c 20 70 45 70 6f 54 61 62 2d 3e 70  b) || pEpoTab->p
3780: 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
3790: 30 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  0].pSchema );.  
37a0: 20 20 20 20 20 20 20 20 70 45 70 6f 54 61 62 2d          pEpoTab-
37b0: 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  >pSchema = db->a
37c0: 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 3b 20 20  Db[0].pSchema;  
37d0: 2f 2a 20 46 6f 72 20 53 48 41 52 45 44 5f 53 43  /* For SHARED_SC
37e0: 48 45 4d 41 20 6d 6f 64 65 20 2a 2f 0a 20 20 20  HEMA mode */.   
37f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45         return pE
3800: 70 6f 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d  poTab;.        }
3810: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
3820: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 6c  endif.    if( fl
3830: 61 67 73 20 26 20 4c 4f 43 41 54 45 5f 4e 4f 45  ags & LOCATE_NOE
3840: 52 52 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  RR ) return 0;. 
3850: 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
3860: 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 65  Schema = 1;.  }e
3870: 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
3880: 6c 28 70 29 20 26 26 20 70 50 61 72 73 65 2d 3e  l(p) && pParse->
3890: 64 69 73 61 62 6c 65 56 74 61 62 20 29 7b 0a 20  disableVtab ){. 
38a0: 20 20 20 70 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20     p = 0;.  }.. 
38b0: 20 69 66 28 20 70 3d 3d 30 20 26 26 20 70 50 61   if( p==0 && pPa
38c0: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
38d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
38e0: 7a 4d 73 67 20 3d 20 66 6c 61 67 73 20 26 20 4c  zMsg = flags & L
38f0: 4f 43 41 54 45 5f 56 49 45 57 20 3f 20 22 6e 6f  OCATE_VIEW ? "no
3900: 20 73 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e   such view" : "n
3910: 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 20  o such table";. 
3920: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
3930: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
3940: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3950: 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67  %s: %s.%s", zMsg
3960: 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29  , zDbase, zName)
3970: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3980: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3990: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20  sg(pParse, "%s: 
39a0: 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65  %s", zMsg, zName
39b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
39c0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
39d0: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  ** Locate the ta
39e0: 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ble identified b
39f0: 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  y *p..**.** This
3a00: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
3a10: 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f 63 61  ound sqlite3Loca
3a20: 74 65 54 61 62 6c 65 28 29 2e 20 54 68 65 20 64  teTable(). The d
3a30: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
3a40: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61  n.** sqlite3Loca
3a50: 74 65 54 61 62 6c 65 28 29 20 61 6e 64 20 74 68  teTable() and th
3a60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
3a70: 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
3a80: 6e 20 72 65 73 74 72 69 63 74 73 0a 2a 2a 20 74  n restricts.** t
3a90: 68 65 20 73 65 61 72 63 68 20 74 6f 20 73 63 68  he search to sch
3aa0: 65 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d 61 29  ema (p->pSchema)
3ab0: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   if it is not NU
3ac0: 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d  LL. p->pSchema m
3ad0: 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c  ay be.** non-NUL
3ae0: 4c 20 69 66 20 69 74 20 69 73 20 70 61 72 74 20  L if it is part 
3af0: 6f 66 20 61 20 76 69 65 77 20 6f 72 20 74 72 69  of a view or tri
3b00: 67 67 65 72 20 70 72 6f 67 72 61 6d 20 64 65 66  gger program def
3b10: 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20  inition. See.** 
3b20: 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
3b30: 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  t() for details.
3b40: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
3b50: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
3b60: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
3b70: 73 65 2c 20 0a 20 20 75 33 32 20 66 6c 61 67 73  se, .  u32 flags
3b80: 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ,.  struct SrcLi
3b90: 73 74 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20  st_item *p.){.  
3ba0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
3bb0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53  .  assert( p->pS
3bc0: 63 68 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a  chema==0 || p->z
3bd0: 44 61 74 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20  Database==0 );. 
3be0: 20 69 66 28 20 70 2d 3e 70 53 63 68 65 6d 61 20   if( p->pSchema 
3bf0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d  ){.    int iDb =
3c00: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
3c10: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
3c20: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  , p->pSchema);. 
3c30: 20 20 20 7a 44 62 20 3d 20 70 50 61 72 73 65 2d     zDb = pParse-
3c40: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44  >db->aDb[iDb].zD
3c50: 62 53 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b  bSName;.  }else{
3c60: 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44  .    zDb = p->zD
3c70: 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72  atabase;.  }.  r
3c80: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63  eturn sqlite3Loc
3c90: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
3ca0: 20 66 6c 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65   flags, p->zName
3cb0: 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , zDb);.}../*.**
3cc0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
3cd0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
3ce0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
3cf0: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
3d00: 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20  index given the 
3d10: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64  name of that ind
3d20: 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61  ex.** and the na
3d30: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
3d40: 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  se that contains
3d50: 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52   the index..** R
3d60: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
3d70: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
3d80: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
3d90: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
3da0: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
3db0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e   the.** table an
3dc0: 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  d the first matc
3dd0: 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65  hing index is re
3de0: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
3df0: 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70  cking.** for dup
3e00: 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d  licate index nam
3e10: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
3e20: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
3e30: 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c  s.** TEMP first,
3e40: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
3e50: 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64   any auxiliary d
3e60: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a  atabases added.*
3e70: 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  * using the ATTA
3e80: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49  CH command..*/.I
3e90: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e  ndex *sqlite3Fin
3ea0: 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  dIndex(sqlite3 *
3eb0: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
3ec0: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
3ed0: 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78  r *zDb){.  Index
3ee0: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
3ef0: 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78  ;.  /* All mutex
3f00: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  es are required 
3f10: 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73  for schema acces
3f20: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65  s.  Make sure we
3f30: 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20   hold them. */. 
3f40: 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d 30 20   assert( zDb!=0 
3f50: 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  || sqlite3BtreeH
3f60: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
3f70: 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d  b) );.  for(i=OM
3f80: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d  IT_TEMPDB; i<db-
3f90: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
3fa0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
3fb0: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
3fc0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
3fd0: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65  MAIN */.    Sche
3fe0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62  ma *pSchema = db
3ff0: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
4000: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
4010: 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28  chema );.    if(
4020: 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53   zDb && sqlite3S
4030: 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e  trICmp(zDb, db->
4040: 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[j].zDbSName)
4050: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4060: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4070: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
4080: 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20  db, j, 0) );.   
4090: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
40a0: 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69  Find(&pSchema->i
40b0: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a  dxHash, zName);.
40c0: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
40d0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
40e0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c  p;.}../*.** Recl
40f0: 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75  aim the memory u
4100: 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a  sed by an index.
4110: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
4120: 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  reeIndex(sqlite3
4130: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b   *db, Index *p){
4140: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4150: 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73  OMIT_ANALYZE.  s
4160: 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65  qlite3DeleteInde
4170: 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b  xSamples(db, p);
4180: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
4190: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
41a0: 70 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  p->pPartIdxWhere
41b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
41c0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
41d0: 2d 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73  ->aColExpr);.  s
41e0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
41f0: 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20   p->zColAff);.  
4200: 69 66 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64  if( p->isResized
4210: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
4220: 28 64 62 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e  (db, (void *)p->
4230: 61 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20  azColl);.#ifdef 
4240: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
4250: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73  AT3_OR_STAT4.  s
4260: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
4270: 69 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66  iRowEst);.#endif
4280: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4290: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
42a0: 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20  * For the index 
42b0: 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20  called zIdxName 
42c0: 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69  which is found i
42d0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
42e0: 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68  Db,.** unlike th
42f0: 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74  at index from it
4300: 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d  s Table then rem
4310: 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72  ove the index fr
4320: 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  om.** the index 
4330: 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66  hash table and f
4340: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73  ree all memory s
4350: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
4360: 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
4370: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
4380: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
4390: 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69  DeleteIndex(sqli
43a0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
43b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
43c0: 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  dxName){.  Index
43d0: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68   *pIndex;.  Hash
43e0: 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65   *pHash;..  asse
43f0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
4400: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
4410: 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73  Db, 0) );.  pHas
4420: 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  h = &db->aDb[iDb
4430: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ].pSchema->idxHa
4440: 73 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  sh;.  pIndex = s
4450: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
4460: 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65  (pHash, zIdxName
4470: 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  , 0);.  if( ALWA
4480: 59 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  YS(pIndex) ){.  
4490: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
44a0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
44b0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49  ndex ){.      pI
44c0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
44d0: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70  ndex = pIndex->p
44e0: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
44f0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  .      Index *p;
4500: 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66  .      /* Justif
4510: 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59  ication of ALWAY
4520: 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20  S();  The index 
4530: 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c  must be on the l
4540: 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ist of.      ** 
4550: 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20  indices. */.    
4560: 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54    p = pIndex->pT
4570: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  able->pIndex;.  
4580: 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
4590: 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74  S(p) && p->pNext
45a0: 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20  !=pIndex ){ p = 
45b0: 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20  p->pNext; }.    
45c0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26    if( ALWAYS(p &
45d0: 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64  & p->pNext==pInd
45e0: 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ex) ){.        p
45f0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
4600: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
4610: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4620: 65 33 46 72 65 65 49 6e 64 65 78 28 64 62 2c 20  e3FreeIndex(db, 
4630: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64  pIndex);.  }.  d
4640: 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44  b->mDbFlags |= D
4650: 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e  BFLAG_SchemaChan
4660: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f  ge;.}../*.** Loo
4670: 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 69  k through the li
4680: 73 74 20 6f 66 20 6f 70 65 6e 20 64 61 74 61 62  st of open datab
4690: 61 73 65 20 66 69 6c 65 73 20 69 6e 20 64 62 2d  ase files in db-
46a0: 3e 61 44 62 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a  >aDb[] and if.**
46b0: 20 61 6e 79 20 68 61 76 65 20 62 65 65 6e 20 63   any have been c
46c0: 6c 6f 73 65 64 2c 20 72 65 6d 6f 76 65 20 74 68  losed, remove th
46d0: 65 6d 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  em from the list
46e0: 2e 20 20 52 65 61 6c 6c 6f 63 61 74 65 20 74 68  .  Reallocate th
46f0: 65 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d 20 73  e.** db->aDb[] s
4700: 74 72 75 63 74 75 72 65 20 74 6f 20 61 20 73 6d  tructure to a sm
4710: 61 6c 6c 65 72 20 73 69 7a 65 2c 20 69 66 20 70  aller size, if p
4720: 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45  ossible..**.** E
4730: 6e 74 72 79 20 30 20 28 74 68 65 20 22 6d 61 69  ntry 0 (the "mai
4740: 6e 22 20 64 61 74 61 62 61 73 65 29 20 61 6e 64  n" database) and
4750: 20 65 6e 74 72 79 20 31 20 28 74 68 65 20 22 74   entry 1 (the "t
4760: 65 6d 70 22 20 64 61 74 61 62 61 73 65 29 0a 2a  emp" database).*
4770: 2a 20 61 72 65 20 6e 65 76 65 72 20 63 61 6e 64  * are never cand
4780: 69 64 61 74 65 73 20 66 6f 72 20 62 65 69 6e 67  idates for being
4790: 20 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76   collapsed..*/.v
47a0: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61  oid sqlite3Colla
47b0: 70 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79  pseDatabaseArray
47c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
47d0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72   int i, j;.  for
47e0: 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44  (i=j=2; i<db->nD
47f0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  b; i++){.    str
4800: 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64  uct Db *pDb = &d
4810: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
4820: 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29  f( pDb->pBt==0 )
4830: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
4840: 62 46 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a  bFree(db, pDb->z
4850: 44 62 53 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  DbSName);.      
4860: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3d 20  pDb->zDbSName = 
4870: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
4880: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
4890: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
48a0: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
48b0: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
48c0: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e   j++;.  }.  db->
48d0: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
48e0: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
48f0: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
4900: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
4910: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
4920: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
4930: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
4940: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4950: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b  ee(db, db->aDb);
4960: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
4970: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
4980: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  }.}../*.** Reset
4990: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
49a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
49b0: 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f  index iDb.  Also
49c0: 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45   reset the.** TE
49d0: 4d 50 20 73 63 68 65 6d 61 2e 20 20 54 68 65 20  MP schema.  The 
49e0: 72 65 73 65 74 20 69 73 20 64 65 66 65 72 72 65  reset is deferre
49f0: 64 20 69 66 20 64 62 2d 3e 6e 53 63 68 65 6d 61  d if db->nSchema
4a00: 4c 6f 63 6b 20 69 73 20 6e 6f 74 20 7a 65 72 6f  Lock is not zero
4a10: 2e 0a 2a 2a 20 44 65 66 65 72 72 65 64 20 72 65  ..** Deferred re
4a20: 73 65 74 73 20 6d 61 79 20 62 65 20 72 75 6e 20  sets may be run 
4a30: 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 74 68 20  by calling with 
4a40: 69 44 62 3c 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  iDb<0..*/.void s
4a50: 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63  qlite3ResetOneSc
4a60: 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62  hema(sqlite3 *db
4a70: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e  , int iDb){.  in
4a80: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 69  t i;.  assert( i
4a90: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20  Db<db->nDb );.. 
4aa0: 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20   if( iDb>=0 ){. 
4ab0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
4ac0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
4ad0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
4ae0: 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
4af0: 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 52  ty(db, iDb, DB_R
4b00: 65 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20  esetWanted);.   
4b10: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64   DbSetProperty(d
4b20: 62 2c 20 31 2c 20 44 42 5f 52 65 73 65 74 57 61  b, 1, DB_ResetWa
4b30: 6e 74 65 64 29 3b 0a 20 20 20 20 64 62 2d 3e 6d  nted);.    db->m
4b40: 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c  DbFlags &= ~DBFL
4b50: 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b  AG_SchemaKnownOk
4b60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
4b70: 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29  nSchemaLock==0 )
4b80: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
4b90: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
4ba0: 20 20 20 20 20 20 69 66 28 20 44 62 48 61 73 50        if( DbHasP
4bb0: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44  roperty(db, i, D
4bc0: 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29 20 29  B_ResetWanted) )
4bd0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4be0: 33 53 63 68 65 6d 61 43 6c 65 61 72 4f 72 44 69  3SchemaClearOrDi
4bf0: 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 69 29 3b  sconnect(db, i);
4c00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4c10: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73   }.}../*.** Eras
4c20: 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66  e all schema inf
4c30: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c  ormation from al
4c40: 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
4c50: 61 73 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a  ases (including.
4c60: 2a 2a 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74  ** "main" and "t
4c70: 65 6d 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67  emp") for a sing
4c80: 6c 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  le database conn
4c90: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
4ca0: 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53  sqlite3ResetAllS
4cb0: 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69  chemasOfConnecti
4cc0: 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  on(sqlite3 *db){
4cd0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
4ce0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
4cf0: 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  (db);.  for(i=0;
4d00: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 3d 28 69   i<db->nDb; i=(i
4d10: 3f 69 2b 31 3a 32 29 29 7b 0a 20 20 20 20 44 62  ?i+1:2)){.    Db
4d20: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
4d30: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
4d40: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
4d50: 20 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68 65     if( db->nSche
4d60: 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  maLock==0 ){.   
4d70: 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65       sqlite3Sche
4d80: 6d 61 43 6c 65 61 72 4f 72 44 69 73 63 6f 6e 6e  maClearOrDisconn
4d90: 65 63 74 28 64 62 2c 20 69 29 3b 0a 20 20 20 20  ect(db, i);.    
4da0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4db0: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64   DbSetProperty(d
4dc0: 62 2c 20 69 2c 20 44 42 5f 52 65 73 65 74 57 61  b, i, DB_ResetWa
4dd0: 6e 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  nted);.      }. 
4de0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
4df0: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62  e3SchemaClear(db
4e00: 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
4e10: 29 3b 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67  );.  db->mDbFlag
4e20: 73 20 26 3d 20 7e 28 44 42 46 4c 41 47 5f 53 63  s &= ~(DBFLAG_Sc
4e30: 68 65 6d 61 43 68 61 6e 67 65 7c 44 42 46 4c 41  hemaChange|DBFLA
4e40: 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29  G_SchemaKnownOk)
4e50: 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  ;.  sqlite3VtabU
4e60: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20  nlockList(db);. 
4e70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
4e80: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 69 66 28  veAll(db);.  if(
4e90: 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b   db->nSchemaLock
4ea0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
4eb0: 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61  e3CollapseDataba
4ec0: 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20 7d  seArray(db);.  }
4ed0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
4ee0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4ef0: 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f   when a commit o
4f00: 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ccurs..*/.void s
4f10: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
4f20: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
4f30: 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e  te3 *db){.  db->
4f40: 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42 46  mDbFlags &= ~DBF
4f50: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
4f60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
4f70: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
4f80: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ed for the colum
4f90: 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62  n names of a tab
4fa0: 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a  le or view (the.
4fb0: 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20  ** Table.aCol[] 
4fc0: 61 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20  array)..*/.void 
4fd0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c  sqlite3DeleteCol
4fe0: 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65 33  umnNames(sqlite3
4ff0: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
5000: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
5010: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
5020: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21   assert( pTable!
5030: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f  =0 );.  if( (pCo
5040: 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  l = pTable->aCol
5050: 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )!=0 ){.    for(
5060: 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  i=0; i<pTable->n
5070: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
5080: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5090: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
50a0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
50b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
50c0: 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  (db, pCol->pDflt
50d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
50e0: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
50f0: 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  >zColl);.    }. 
5100: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5110: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f  (db, pTable->aCo
5120: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
5130: 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f   Remove the memo
5140: 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ry data structur
5150: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
5160: 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  th the given.** 
5170: 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67  Table.  No chang
5180: 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64  es are made to d
5190: 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74  isk by this rout
51a0: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ine..**.** This 
51b0: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c  routine just del
51c0: 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74  etes the data st
51d0: 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65  ructure.  It doe
51e0: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20  s not unlink.** 
51f0: 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73  the table data s
5200: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
5210: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42  e hash table.  B
5220: 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72  ut it does destr
5230: 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72  oy.** memory str
5240: 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69  uctures of the i
5250: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
5260: 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74  gn keys associat
5270: 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
5280: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
5290: 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 69 73   db parameter is
52a0: 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69   optional.  It i
52b0: 73 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20  s needed if the 
52c0: 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  Table object .**
52d0: 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73   contains lookas
52e0: 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61  ide memory.  (Ta
52f0: 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  ble objects in t
5300: 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74  he schema do not
5310: 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64   use.** lookasid
5320: 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f  e memory, but so
5330: 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62  me ephemeral Tab
5340: 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20  le objects do.) 
5350: 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61   Or the.** db pa
5360: 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75  rameter can be u
5370: 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42  sed with db->pnB
5380: 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61  ytesFreed to mea
5390: 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a  sure the memory.
53a0: 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 54  ** used by the T
53b0: 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  able object..*/.
53c0: 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49  static void SQLI
53d0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65  TE_NOINLINE dele
53e0: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
53f0: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
5400: 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  le){.  Index *pI
5410: 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 0a 23  ndex, *pNext;..#
5420: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
5430: 55 47 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  UG.  /* Record t
5440: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
5450: 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69  standing lookasi
5460: 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69  de allocations i
5470: 6e 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 0a  n schema Tables.
5480: 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f    ** prior to do
5490: 69 6e 67 20 61 6e 79 20 66 72 65 65 28 29 20 6f  ing any free() o
54a0: 70 65 72 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63  perations.  Sinc
54b0: 65 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 20  e schema Tables 
54c0: 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20  do not use.  ** 
54d0: 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69 73 20  lookaside, this 
54e0: 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f  number should no
54f0: 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 69  t change. */.  i
5500: 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  nt nLookaside = 
5510: 30 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20 28  0;.  if( db && (
5520: 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73  pTable->tabFlags
5530: 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
5540: 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4c 6f 6f 6b  ==0 ){.    nLook
5550: 61 73 69 64 65 20 3d 20 73 71 6c 69 74 65 33 4c  aside = sqlite3L
5560: 6f 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c  ookasideUsed(db,
5570: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
5580: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
5590: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
55a0: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
55b0: 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49  ble. */.  for(pI
55c0: 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70  ndex = pTable->p
55d0: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
55e0: 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20  Index=pNext){.  
55f0: 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78    pNext = pIndex
5600: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73  ->pNext;.    ass
5610: 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63  ert( pIndex->pSc
5620: 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53  hema==pTable->pS
5630: 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20 20 7c  chema.         |
5640: 7c 20 28 49 73 56 69 72 74 75 61 6c 28 70 54 61  | (IsVirtual(pTa
5650: 62 6c 65 29 20 26 26 20 70 49 6e 64 65 78 2d 3e  ble) && pIndex->
5660: 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  idxType!=SQLITE_
5670: 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 29 20  IDXTYPE_APPDEF) 
5680: 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62 3d 3d  );.    if( (db==
5690: 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73  0 || db->pnBytes
56a0: 46 72 65 65 64 3d 3d 30 29 20 26 26 20 21 49 73  Freed==0) && !Is
56b0: 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20  Virtual(pTable) 
56c0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
56d0: 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a  Name = pIndex->z
56e0: 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45 53  Name; .      TES
56f0: 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a 70  TONLY ( Index *p
5700: 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33 48  Old = ) sqlite3H
5710: 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20 20  ashInsert(.     
5720: 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53 63      &pIndex->pSc
5730: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a  hema->idxHash, z
5740: 4e 61 6d 65 2c 20 30 0a 20 20 20 20 20 20 29 3b  Name, 0.      );
5750: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
5760: 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  b==0 || sqlite3S
5770: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
5780: 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53  b, 0, pIndex->pS
5790: 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20  chema) );.      
57a0: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49  assert( pOld==pI
57b0: 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20  ndex || pOld==0 
57c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
57d0: 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 64 62  ite3FreeIndex(db
57e0: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a  , pIndex);.  }..
57f0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20    /* Delete any 
5800: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74  foreign keys att
5810: 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74 61  ached to this ta
5820: 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ble. */.  sqlite
5830: 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54  3FkDelete(db, pT
5840: 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c  able);..  /* Del
5850: 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ete the Table st
5860: 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a  ructure itself..
5870: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 65    */.  sqlite3De
5880: 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
5890: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73  db, pTable);.  s
58a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
58b0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
58c0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
58d0: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f  (db, pTable->zCo
58e0: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  lAff);.  sqlite3
58f0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
5900: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
5910: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
5920: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
5930: 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a  Table->pCheck);.
5940: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5950: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
5960: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c  .  sqlite3VtabCl
5970: 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ear(db, pTable);
5980: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
5990: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
59a0: 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66  le);..  /* Verif
59b0: 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73  y that no lookas
59c0: 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75  ide memory was u
59d0: 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74 61  sed by schema ta
59e0: 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  bles */.  assert
59f0: 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20  ( nLookaside==0 
5a00: 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 73  || nLookaside==s
5a10: 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55  qlite3LookasideU
5a20: 73 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a 76  sed(db,0) );.}.v
5a30: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74  oid sqlite3Delet
5a40: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
5a50: 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  db, Table *pTabl
5a60: 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  e){.  /* Do not 
5a70: 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65  delete the table
5a80: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72   until the refer
5a90: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
5aa0: 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66  es zero. */.  if
5ab0: 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74 75  ( !pTable ) retu
5ac0: 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62 20  rn;.  if( ((!db 
5ad0: 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  || db->pnBytesFr
5ae0: 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54  eed==0) && (--pT
5af0: 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e 30  able->nTabRef)>0
5b00: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 65  ) ) return;.  de
5b10: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
5b20: 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  able);.}.../*.**
5b30: 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65   Unlink the give
5b40: 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  n table from the
5b50: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
5b60: 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a   the delete the.
5b70: 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  ** table structu
5b80: 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20  re with all its 
5b90: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
5ba0: 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69  ign keys..*/.voi
5bb0: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
5bc0: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  ndDeleteTable(sq
5bd0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
5be0: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
5bf0: 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62  zTabName){.  Tab
5c00: 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62  le *p;.  Db *pDb
5c10: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
5c20: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5c30: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
5c40: 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
5c50: 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20  t( zTabName );. 
5c60: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5c70: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
5c80: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
5c90: 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e   testcase( zTabN
5ca0: 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a  ame[0]==0 );  /*
5cb0: 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62   Zero-length tab
5cc0: 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c  le names are all
5cd0: 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20  owed */.  pDb = 
5ce0: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
5cf0: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
5d00: 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63  Insert(&pDb->pSc
5d10: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a  hema->tblHash, z
5d20: 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73  TabName, 0);.  s
5d30: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
5d40: 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e  e(db, p);.  db->
5d50: 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c  mDbFlags |= DBFL
5d60: 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b  AG_SchemaChange;
5d70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
5d80: 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20  a token, return 
5d90: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f  a string that co
5da0: 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65  nsists of the te
5db0: 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f  xt of that.** to
5dc0: 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ken.  Space to h
5dd0: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
5de0: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62   string.** is ob
5df0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
5e00: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
5e10: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
5e20: 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  the calling.** f
5e30: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  unction..**.** A
5e40: 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72  ny quotation mar
5e50: 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c  ks (ex:  "name",
5e60: 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c   'name', [name],
5e70: 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74   or `name`) that
5e80: 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65  .** surround the
5e90: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b   body of the tok
5ea0: 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a  en are removed..
5eb0: 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65  **.** Tokens are
5ec0: 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e   often just poin
5ed0: 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72  ters into the or
5ee0: 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20  iginal SQL text 
5ef0: 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f  and so.** are no
5f00: 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  t \000 terminate
5f10: 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65  d and are not pe
5f20: 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72  rsistent.  The r
5f30: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
5f40: 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e  * is \000 termin
5f50: 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73  ated and is pers
5f60: 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20  istent..*/.char 
5f70: 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d  *sqlite3NameFrom
5f80: 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64  Token(sqlite3 *d
5f90: 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  b, Token *pName)
5fa0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
5fb0: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
5fc0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
5fd0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
5fe0: 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a   (char*)pName->z
5ff0: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
6000: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
6010: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zName);.  }else{
6020: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a  .    zName = 0;.
6030: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
6040: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  me;.}../*.** Ope
6050: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
6060: 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64  ter table stored
6070: 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d   in database num
6080: 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77  ber iDb for.** w
6090: 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c  riting. The tabl
60a0: 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e  e is opened usin
60b0: 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76  g cursor 0..*/.v
60c0: 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d  oid sqlite3OpenM
60d0: 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65  asterTable(Parse
60e0: 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *p, int iDb){. 
60f0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
6100: 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20  e3GetVdbe(p);.  
6110: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
6120: 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f  (p, iDb, MASTER_
6130: 52 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52 5f  ROOT, 1, MASTER_
6140: 4e 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65 33  NAME);.  sqlite3
6150: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
6160: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
6170: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69  , MASTER_ROOT, i
6180: 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70 2d  Db, 5);.  if( p-
6190: 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  >nTab==0 ){.    
61a0: 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d  p->nTab = 1;.  }
61b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
61c0: 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73  ter zName points
61d0: 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   to a nul-termin
61e0: 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74  ated buffer cont
61f0: 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a  aining the name.
6200: 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  ** of a database
6210: 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22   ("main", "temp"
6220: 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   or the name of 
6230: 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e  an attached db).
6240: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
6250: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e  n returns the in
6260: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
6270: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
6280: 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31  >aDb[], or.** -1
6290: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
62a0: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
62b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
62c0: 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74  FindDbName(sqlit
62d0: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
62e0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
62f0: 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  t i = -1;       
6300: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
6310: 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e  mber */.  if( zN
6320: 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70  ame ){.    Db *p
6330: 44 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64  Db;.    for(i=(d
6340: 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26  b->nDb-1), pDb=&
6350: 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30  db->aDb[i]; i>=0
6360: 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20  ; i--, pDb--){. 
6370: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
6380: 74 65 33 5f 73 74 72 69 63 6d 70 28 70 44 62 2d  te3_stricmp(pDb-
6390: 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d 65  >zDbSName, zName
63a0: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
63b0: 20 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20 61 6c   /* "main" is al
63c0: 77 61 79 73 20 61 6e 20 61 63 63 65 70 74 61 62  ways an acceptab
63d0: 6c 65 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  le alias for the
63e0: 20 70 72 69 6d 61 72 79 20 64 61 74 61 62 61 73   primary databas
63f0: 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20  e.      ** even 
6400: 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 72  if it has been r
6410: 65 6e 61 6d 65 64 20 75 73 69 6e 67 20 53 51 4c  enamed using SQL
6420: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41 49  ITE_DBCONFIG_MAI
6430: 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20 20  NDBNAME. */.    
6440: 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 30 3d    if( i==0 && 0=
6450: 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70  =sqlite3_stricmp
6460: 28 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29 20  ("main", zName) 
6470: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
6480: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
6490: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65  ../*.** The toke
64a0: 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e  n *pName contain
64b0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
64c0: 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72  database (either
64d0: 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74   "main" or.** "t
64e0: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
64f0: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
6500: 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  db). This routin
6510: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
6520: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61   index of the na
6530: 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20  med database in 
6540: 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31  db->aDb[], or -1
6550: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
6560: 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78   .** does not ex
6570: 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
6580: 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65  te3FindDb(sqlite
6590: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
65a0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  ame){.  int i;  
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
65d0: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
65e0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
65f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
6610: 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69  e we are searchi
6620: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d  ng for */.  zNam
6630: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
6640: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
6650: 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74  me);.  i = sqlit
6660: 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
6670: 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74   zName);.  sqlit
6680: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
6690: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b  me);.  return i;
66a0: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65  .}../* The table
66b0: 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67   or view or trig
66c0: 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73  ger name is pass
66d0: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
66e0: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a  ne via tokens.**
66f0: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
6700: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
6710: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
6720: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
6730: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52  xample:.**.** CR
6740: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
6750: 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a  yy (...);.** .**
6760: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
6770: 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64  set to "xxx" and
6780: 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f   pName2 "yyy". O
6790: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
67a0: 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
67b0: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
67c0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
67d0: 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  e.:.**.** CREATE
67e0: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
67f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  .**.** Then pNam
6800: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79  e1 is set to "yy
6810: 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73  y" and pName2 is
6820: 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ""..**.** This 
6830: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
6840: 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74   *ppUnqual point
6850: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
6860: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
6870: 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74   or.** pName2) t
6880: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75  hat stores the u
6890: 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  nqualified table
68a0: 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65   name.  The inde
68b0: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  x of the.** data
68c0: 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65  base "xxx" is re
68d0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
68e0: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
68f0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
6900: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
6910: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
6920: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
6930: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
6940: 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e1,      /* The 
6950: 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d  "xxx" in the nam
6960: 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22  e "xxx.yyy" or "
6970: 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  xxx" */.  Token 
6980: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a  *pName2,      /*
6990: 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68   The "yyy" in th
69a0: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
69b0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55   */.  Token **pU
69c0: 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69  nqual     /* Wri
69d0: 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  te the unqualifi
69e0: 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68  ed object name h
69f0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
6a00: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
6a10: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
6a20: 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ase holding the 
6a30: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
6a40: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6a50: 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  ->db;..  assert(
6a60: 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20 20   pName2!=0 );.  
6a70: 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20  if( pName2->n>0 
6a80: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69  ){.    if( db->i
6a90: 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20  nit.busy ) {.   
6aa0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6ab0: 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72  sg(pParse, "corr
6ac0: 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a  upt database");.
6ad0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
6ae0: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71  .    }.    *pUnq
6af0: 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20  ual = pName2;.  
6b00: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
6b10: 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31  indDb(db, pName1
6b20: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
6b30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6b40: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6b50: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62  , "unknown datab
6b60: 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29  ase %T", pName1)
6b70: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
6b80: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
6b90: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
6ba0: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c  ->init.iDb==0 ||
6bb0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c   db->init.busy |
6bc0: 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  | IN_RENAME_OBJE
6bd0: 43 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  CT.             
6be0: 7c 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73  || (db->mDbFlags
6bf0: 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75 75 6d   & DBFLAG_Vacuum
6c00: 29 21 3d 30 29 3b 0a 20 20 20 20 69 44 62 20 3d  )!=0);.    iDb =
6c10: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20   db->init.iDb;. 
6c20: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
6c30: 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame1;.  }.  retu
6c40: 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn iDb;.}../*.**
6c50: 20 54 72 75 65 20 69 66 20 50 52 41 47 4d 41 20   True if PRAGMA 
6c60: 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20  writable_schema 
6c70: 69 73 20 4f 4e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  is ON.*/.int sql
6c80: 69 74 65 33 57 72 69 74 61 62 6c 65 53 63 68 65  ite3WritableSche
6c90: 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ma(sqlite3 *db){
6ca0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 64 62  .  testcase( (db
6cb0: 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f  ->flags&(SQLITE_
6cc0: 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49  WriteSchema|SQLI
6cd0: 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d  TE_Defensive))==
6ce0: 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
6cf0: 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c   (db->flags&(SQL
6d00: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c  ITE_WriteSchema|
6d10: 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65  SQLITE_Defensive
6d20: 29 29 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ))==.           
6d30: 20 20 20 20 53 51 4c 49 54 45 5f 57 72 69 74 65      SQLITE_Write
6d40: 53 63 68 65 6d 61 20 29 3b 0a 20 20 74 65 73 74  Schema );.  test
6d50: 63 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67 73  case( (db->flags
6d60: 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  &(SQLITE_WriteSc
6d70: 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65  hema|SQLITE_Defe
6d80: 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20 20  nsive))==.      
6d90: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6da0: 44 65 66 65 6e 73 69 76 65 20 29 3b 0a 20 20 74  Defensive );.  t
6db0: 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66 6c  estcase( (db->fl
6dc0: 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69 74  ags&(SQLITE_Writ
6dd0: 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44  eSchema|SQLITE_D
6de0: 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20  efensive))==.   
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
6e00: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c  ITE_WriteSchema|
6e10: 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65  SQLITE_Defensive
6e20: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 64  ) );.  return (d
6e30: 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45  b->flags&(SQLITE
6e40: 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c  _WriteSchema|SQL
6e50: 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d  ITE_Defensive))=
6e60: 3d 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68  =SQLITE_WriteSch
6e70: 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ema;.}../*.** Th
6e80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
6e90: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
6ea0: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
6eb0: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
6ec0: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
6ed0: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
6ee0: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
6ef0: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
6f00: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
6f10: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
6f20: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
6f30: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
6f40: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
6f50: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
6f60: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
6f70: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
6f80: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
6f90: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
6fa0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
6fb0: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
6fc0: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
6fd0: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
6fe0: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
6ff0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
7000: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
7010: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
7020: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20  e->nested==0 .  
7030: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
7040: 65 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d 61  e3WritableSchema
7050: 28 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 0a  (pParse->db)==0.
7060: 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d            && 0==
7070: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
7080: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
7090: 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  , 7) ){.    sqli
70a0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
70b0: 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65  se, "object name
70c0: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e   reserved for in
70d0: 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c  ternal use: %s",
70e0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74   zName);.    ret
70f0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
7100: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
7110: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
7120: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 52  ** Return the PR
7130: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20  IMARY KEY index 
7140: 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e  of a table.*/.In
7150: 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d  dex *sqlite3Prim
7160: 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c  aryKeyIndex(Tabl
7170: 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65  e *pTab){.  Inde
7180: 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54  x *p;.  for(p=pT
7190: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26  ab->pIndex; p &&
71a0: 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e   !IsPrimaryKeyIn
71b0: 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65  dex(p); p=p->pNe
71c0: 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70  xt){}.  return p
71d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
71e0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  n the column of 
71f0: 69 6e 64 65 78 20 70 49 64 78 20 74 68 61 74 20  index pIdx that 
7200: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
7210: 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69  able.** column i
7220: 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  Col.  Return -1 
7230: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
7240: 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75  .i16 sqlite3Colu
7250: 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20  mnOfIndex(Index 
7260: 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29  *pIdx, i16 iCol)
7270: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
7280: 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43  (i=0; i<pIdx->nC
7290: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
72a0: 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d   if( iCol==pIdx-
72b0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72  >aiColumn[i] ) r
72c0: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
72d0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
72e0: 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75  ** Begin constru
72f0: 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  cting a new tabl
7300: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
7310: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
7320: 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  s is.** the firs
7330: 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74  t of several act
7340: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ion routines tha
7350: 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20  t get called in 
7360: 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61  response.** to a
7370: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
7380: 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72  atement.  In par
7390: 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f  ticular, this ro
73a0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a  utine is called.
73b0: 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20  ** after seeing 
73c0: 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20  tokens "CREATE" 
73d0: 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20  and "TABLE" and 
73e0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
73f0: 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c  The isTemp.** fl
7400: 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  ag is true if th
7410: 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  e table should b
7420: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
7430: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
7440: 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  se.** file inste
7450: 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69  ad of in the mai
7460: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
7470: 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
7480: 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77  ly the case.** w
7490: 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f  hen the "TEMP" o
74a0: 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65  r "TEMPORARY" ke
74b0: 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20  yword occurs in 
74c0: 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54  between.** CREAT
74d0: 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a  E and TABLE..**.
74e0: 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  ** The new table
74f0: 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69   record is initi
7500: 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69  alized and put i
7510: 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  n pParse->pNewTa
7520: 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20  ble..** As more 
7530: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
7540: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73  BLE statement is
7550: 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f   parsed, additio
7560: 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f  nal action.** ro
7570: 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63  utines will be c
7580: 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72  alled to add mor
7590: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
75a0: 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a   this record..**
75b0: 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
75c0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
75d0: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73  statement, the s
75e0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
75f0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
7600: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74  alled to complet
7610: 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69  e the constructi
7620: 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  on of the new ta
7630: 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76  ble record..*/.v
7640: 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74  oid sqlite3Start
7650: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
7660: 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
7670: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
7680: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
7690: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20    /* First part 
76a0: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
76b0: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
76c0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
76d0: 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64  me2,   /* Second
76e0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d   part of the nam
76f0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
7700: 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  r view */.  int 
7710: 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20  isTemp,      /* 
7720: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
7730: 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a  a TEMP table */.
7740: 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20    int isView,   
7750: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
7760: 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a  is is a VIEW */.
7770: 20 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c    int isVirtual,
7780: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
7790: 69 73 20 69 73 20 61 20 56 49 52 54 55 41 4c 20  is is a VIRTUAL 
77a0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
77b0: 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44  oErr        /* D
77c0: 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62  o nothing if tab
77d0: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
77e0: 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
77f0: 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20  *pTable;.  char 
7800: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54  *zName = 0; /* T
7810: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e  he name of the n
7820: 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ew table */.  sq
7830: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7840: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
7850: 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  v;.  int iDb;   
7860: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
7870: 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61  e number to crea
7880: 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  te the table in 
7890: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
78a0: 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69  e;    /* Unquali
78b0: 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65  fied name of the
78c0: 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65   table to create
78d0: 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69   */..  if( db->i
78e0: 6e 69 74 2e 62 75 73 79 20 26 26 20 64 62 2d 3e  nit.busy && db->
78f0: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20  init.newTnum==1 
7900: 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63 69 61  ){.    /* Specia
7910: 6c 20 63 61 73 65 3a 20 20 50 61 72 73 69 6e 67  l case:  Parsing
7920: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
7930: 65 72 20 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d  er or sqlite_tem
7940: 70 5f 6d 61 73 74 65 72 20 73 63 68 65 6d 61 20  p_master schema 
7950: 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d  */.    iDb = db-
7960: 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 7a  >init.iDb;.    z
7970: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
7980: 53 74 72 44 75 70 28 64 62 2c 20 53 43 48 45 4d  StrDup(db, SCHEM
7990: 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20  A_TABLE(iDb));. 
79a0: 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65     pName = pName
79b0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
79c0: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
79d0: 73 65 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20  se */.    iDb = 
79e0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
79f0: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
7a00: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
7a10: 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  e);.    if( iDb<
7a20: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
7a30: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
7a40: 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e   && isTemp && pN
7a50: 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62  ame2->n>0 && iDb
7a60: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=1 ){.      /* 
7a70: 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65  If creating a te
7a80: 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61  mp table, the na
7a90: 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75  me may not be qu
7aa0: 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20  alified. Unless 
7ab0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
7ac0: 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22  tabase name is "
7ad0: 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a  temp" anyway.  *
7ae0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
7af0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7b00: 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65  "temporary table
7b10: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e   name must be un
7b20: 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20  qualified");.   
7b30: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
7b40: 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
7b50: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
7b60: 29 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a  ) iDb = 1;.    z
7b70: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
7b80: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
7b90: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
7ba0: 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
7bb0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7bc0: 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28  3RenameTokenMap(
7bd0: 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a  pParse, (void*)z
7be0: 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  Name, pName);.  
7bf0: 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65    }.  }.  pParse
7c00: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a  ->sNameToken = *
7c10: 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61  pName;.  if( zNa
7c20: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
7c30: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
7c40: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
7c50: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
7c60: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f  zName) ){.    go
7c70: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7c80: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
7c90: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
7ca0: 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69  ) isTemp = 1;.#i
7cb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7cc0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
7cd0: 20 20 61 73 73 65 72 74 28 20 69 73 54 65 6d 70    assert( isTemp
7ce0: 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31  ==0 || isTemp==1
7cf0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
7d00: 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65  View==0 || isVie
7d10: 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20  w==1 );.  {.    
7d20: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
7d30: 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  aCode[] = {.    
7d40: 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45     SQLITE_CREATE
7d50: 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53  _TABLE,.       S
7d60: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
7d70: 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20  P_TABLE,.       
7d80: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
7d90: 45 57 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54  EW,.       SQLIT
7da0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49  E_CREATE_TEMP_VI
7db0: 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68  EW.    };.    ch
7dc0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
7dd0: 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
7de0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7df0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
7e00: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
7e10: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
7e20: 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
7e30: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
7e40: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
7e50: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69      }.    if( !i
7e60: 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69  sVirtual && sqli
7e70: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
7e80: 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b  rse, (int)aCode[
7e90: 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d  isTemp+2*isView]
7ea0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ec0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20           zName, 
7ed0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
7ee0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7ef0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
7f00: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
7f10: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
7f20: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
7f30: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
7f40: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
7f50: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
7f60: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
7f70: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
7f80: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
7f90: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
7fa0: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
7fb0: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
7fc0: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
7fd0: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
7fe0: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
7ff0: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
8000: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
8010: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
8020: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
8030: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
8040: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
8050: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
8060: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
8070: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
8080: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
8090: 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45  IN_SPECIAL_PARSE
80a0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44   ){.    char *zD
80b0: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
80c0: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69  .zDbSName;.    i
80d0: 66 28 20 21 49 73 52 65 75 73 65 53 63 68 65 6d  f( !IsReuseSchem
80e0: 61 28 64 62 29 20 26 26 20 53 51 4c 49 54 45 5f  a(db) && SQLITE_
80f0: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
8100: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
8110: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
8120: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
8130: 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20     }.    pTable 
8140: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
8150: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  le(db, zName, zD
8160: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  b);.    if( pTab
8170: 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
8180: 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20  !noErr ){.      
8190: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
81a0: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
81b0: 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73   %T already exis
81c0: 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ts", pName);.   
81d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
81e0: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
81f0: 6e 69 74 2e 62 75 73 79 20 7c 7c 20 43 4f 52 52  nit.busy || CORR
8200: 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20  UPT_DB );.      
8210: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
8220: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
8230: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a  , iDb);.      }.
8240: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
8250: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
8260: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
8270: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
8280: 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20   zName, zDb)!=0 
8290: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
82a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
82b0: 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
82c0: 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65  dy an index name
82d0: 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
82e0: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
82f0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
8300: 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65   }.  }..  pTable
8310: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8320: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
8330: 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28  f(Table));.  if(
8340: 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20   pTable==0 ){.  
8350: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
8360: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
8370: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
8380: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
8390: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
83a0: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62  rr++;.    goto b
83b0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
83c0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  ;.  }.  pTable->
83d0: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
83e0: 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d   pTable->iPKey =
83f0: 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70   -1;.  pTable->p
8400: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
8410: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  [iDb].pSchema;. 
8420: 20 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66   pTable->nTabRef
8430: 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 1;.#ifdef SQL
8440: 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45  ITE_DEFAULT_ROWE
8450: 53 54 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f  ST.  pTable->nRo
8460: 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69 74 65  wLogEst = sqlite
8470: 33 4c 6f 67 45 73 74 28 53 51 4c 49 54 45 5f 44  3LogEst(SQLITE_D
8480: 45 46 41 55 4c 54 5f 52 4f 57 45 53 54 29 3b 0a  EFAULT_ROWEST);.
8490: 23 65 6c 73 65 0a 20 20 70 54 61 62 6c 65 2d 3e  #else.  pTable->
84a0: 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30  nRowLogEst = 200
84b0: 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73  ; assert( 200==s
84c0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34  qlite3LogEst(104
84d0: 38 35 37 36 29 20 29 3b 0a 23 65 6e 64 69 66 0a  8576) );.#endif.
84e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
84f0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29  ->pNewTable==0 )
8500: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
8510: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
8520: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
8530: 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74   the magic sqlit
8540: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
8550: 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63   used by autoinc
8560: 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65  rement,.  ** the
8570: 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  n record a point
8580: 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  er to this table
8590: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
85a0: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a  abase structure.
85b0: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53    ** so that INS
85c0: 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65  ERT can find the
85d0: 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20   table easily.. 
85e0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
85f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
8600: 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61  EMENT.  if( !pPa
8610: 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73  rse->nested && s
8620: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  trcmp(zName, "sq
8630: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
8640: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
8650: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
8660: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
8670: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62  , 0) );.    pTab
8680: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  le->pSchema->pSe
8690: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
86a0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
86b0: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
86c0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
86d0: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
86e0: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
86f0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
8700: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
8710: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
8720: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
8730: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
8740: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
8750: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
8760: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
8770: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
8780: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
8790: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
87a0: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
87b0: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
87c0: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
87d0: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
87e0: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
87f0: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
8800: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
8810: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
8820: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
8830: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
8840: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
8850: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
8860: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
8870: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
8880: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
8890: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
88a0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  0 ){.    int add
88b0: 72 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65  r1;.    int file
88c0: 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20  Format;.    int 
88d0: 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33  reg1, reg2, reg3
88e0: 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c 6c 52 6f 77  ;.    /* nullRow
88f0: 5b 5d 20 69 73 20 61 6e 20 4f 50 5f 52 65 63 6f  [] is an OP_Reco
8900: 72 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  rd encoding of a
8910: 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
8920: 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20 20 20 73  5 NULLs */.    s
8930: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
8940: 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d 20 7b 20 36   nullRow[] = { 6
8950: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 0, 0, 0, 0, 0 
8960: 7d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  };.    sqlite3Be
8970: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
8980: 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
8990: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
89a0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
89b0: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56  ABLE.    if( isV
89c0: 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20  irtual ){.      
89d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
89e0: 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b  0(v, OP_VBegin);
89f0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
8a00: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
8a10: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63  e format and enc
8a20: 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74  oding in the dat
8a30: 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62  abase have not b
8a40: 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a  een set, .    **
8a50: 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20   set them now.. 
8a60: 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d     */.    reg1 =
8a70: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
8a80: 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
8a90: 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70  em;.    reg2 = p
8aa0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d  Parse->regRoot =
8ab0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
8ac0: 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50  .    reg3 = ++pP
8ad0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
8ae0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8af0: 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b  3(v, OP_ReadCook
8b00: 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42  ie, iDb, reg3, B
8b10: 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  TREE_FILE_FORMAT
8b20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8b30: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
8b40: 44 62 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d  Db);.    addr1 =
8b50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8b60: 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p1(v, OP_If, reg
8b70: 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  3); VdbeCoverage
8b80: 28 76 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72  (v);.    fileFor
8b90: 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mat = (db->flags
8ba0: 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79   & SQLITE_Legacy
8bb0: 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20  FileFmt)!=0 ?.  
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bd0: 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  1 : SQLITE_MAX_F
8be0: 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20  ILE_FORMAT;.    
8bf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8c00: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
8c10: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49  e, iDb, BTREE_FI
8c20: 4c 45 5f 46 4f 52 4d 41 54 2c 20 66 69 6c 65 46  LE_FORMAT, fileF
8c30: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  ormat);.    sqli
8c40: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8c50: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
8c60: 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45  Db, BTREE_TEXT_E
8c70: 4e 43 4f 44 49 4e 47 2c 20 45 4e 43 28 64 62 29  NCODING, ENC(db)
8c80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8c90: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
8ca0: 64 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  dr1);..    /* Th
8cb0: 69 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20  is just creates 
8cc0: 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72  a place-holder r
8cd0: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c  ecord in the sql
8ce0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
8cf0: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  ..    ** The rec
8d00: 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73  ord created does
8d10: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79   not contain any
8d20: 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77  thing yet.  It w
8d30: 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a  ill be replaced.
8d40: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65      ** by the re
8d50: 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65  al entry in code
8d60: 20 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71   generated at sq
8d70: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e  lite3EndTable().
8d80: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
8d90: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
8da0: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65   new entry is le
8db0: 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 70  ft in register p
8dc0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e  Parse->regRowid.
8dd0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74  .    ** The root
8de0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
8df0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73  the new table is
8e00: 20 6c 65 66 74 20 69 6e 20 72 65 67 20 70 50 61   left in reg pPa
8e10: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20  rse->regRoot..  
8e20: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61    ** The rowid a
8e30: 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  nd root page num
8e40: 62 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e  ber values are n
8e50: 65 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64  eeded by the cod
8e60: 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71  e that.    ** sq
8e70: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69  lite3EndTable wi
8e80: 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20  ll generate..   
8e90: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
8ea0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
8eb0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
8ec0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
8ed0: 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28  ALTABLE).    if(
8ee0: 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72   isView || isVir
8ef0: 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  tual ){.      sq
8f00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8f10: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
8f20: 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c  , reg2);.    }el
8f30: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
8f40: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64        pParse->ad
8f50: 64 72 43 72 54 61 62 20 3d 0a 20 20 20 20 20 20  drCrTab =.      
8f60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8f70: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74  dOp3(v, OP_Creat
8f80: 65 42 74 72 65 65 2c 20 69 44 62 2c 20 72 65 67  eBtree, iDb, reg
8f90: 32 2c 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 29  2, BTREE_INTKEY)
8fa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
8fb0: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
8fc0: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
8fd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8fe0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
8ff0: 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b  Rowid, 0, reg1);
9000: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9010: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f  AddOp4(v, OP_Blo
9020: 62 2c 20 36 2c 20 72 65 67 33 2c 20 30 2c 20 6e  b, 6, reg3, 0, n
9030: 75 6c 6c 52 6f 77 2c 20 50 34 5f 53 54 41 54 49  ullRow, P4_STATI
9040: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
9050: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
9060: 49 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c  Insert, 0, reg3,
9070: 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69   reg1);.    sqli
9080: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
9090: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
90a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
90b0: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43  beAddOp0(v, OP_C
90c0: 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lose);.  }..  /*
90d0: 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72   Normal (non-err
90e0: 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20  or) return. */. 
90f0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49   return;..  /* I
9100: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
9110: 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20  s, we jump here 
9120: 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  */.begin_table_e
9130: 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44  rror:.  sqlite3D
9140: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
9150: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
9160: 2a 20 53 65 74 20 70 72 6f 70 65 72 74 69 65 73  * Set properties
9170: 20 6f 66 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   of a table colu
9180: 6d 6e 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  mn based on the 
9190: 28 6d 61 67 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d  (magical).** nam
91a0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e of the column.
91b0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .*/.#if SQLITE_E
91c0: 4e 41 42 4c 45 5f 48 49 44 44 45 4e 5f 43 4f 4c  NABLE_HIDDEN_COL
91d0: 55 4d 4e 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  UMNS.void sqlite
91e0: 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65  3ColumnPropertie
91f0: 73 46 72 6f 6d 4e 61 6d 65 28 54 61 62 6c 65 20  sFromName(Table 
9200: 2a 70 54 61 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70  *pTab, Column *p
9210: 43 6f 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  Col){.  if( sqli
9220: 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 70 43 6f  te3_strnicmp(pCo
9230: 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68 69 64  l->zName, "__hid
9240: 64 65 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30 20 29  den__", 10)==0 )
9250: 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46  {.    pCol->colF
9260: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
9270: 48 49 44 44 45 4e 3b 0a 20 20 7d 65 6c 73 65 20  HIDDEN;.  }else 
9280: 69 66 28 20 70 54 61 62 20 26 26 20 70 43 6f 6c  if( pTab && pCol
9290: 21 3d 70 54 61 62 2d 3e 61 43 6f 6c 20 26 26 20  !=pTab->aCol && 
92a0: 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61  (pCol[-1].colFla
92b0: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44  gs & COLFLAG_HID
92c0: 44 45 4e 29 20 29 7b 0a 20 20 20 20 70 54 61 62  DEN) ){.    pTab
92d0: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
92e0: 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a 20 20 7d 0a  _OOOHidden;.  }.
92f0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
9300: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
9310: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
9320: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
9330: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
9340: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
9350: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
9360: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
9370: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
9380: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
9390: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
93a0: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
93b0: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
93c0: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
93d0: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
93e0: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
93f0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
9400: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
9410: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9420: 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20  AddColumn(Parse 
9430: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
9440: 70 4e 61 6d 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  pName, Token *pT
9450: 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ype){.  Table *p
9460: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
9470: 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 54  r *z;.  char *zT
9480: 79 70 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  ype;.  Column *p
9490: 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
94a0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
94b0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
94c0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
94d0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
94e0: 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e  ( p->nCol+1>db->
94f0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
9500: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
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 74 6f 6f 20  sg(pParse, "too 
9530: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20  many columns on 
9540: 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  %s", p->zName);.
9550: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9560: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    z = sqlite3DbM
9570: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 4e 61  allocRaw(db, pNa
9580: 6d 65 2d 3e 6e 20 2b 20 70 54 79 70 65 2d 3e 6e  me->n + pType->n
9590: 20 2b 20 32 29 3b 0a 20 20 69 66 28 20 7a 3d 3d   + 2);.  if( z==
95a0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
95b0: 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
95c0: 43 54 20 29 20 73 71 6c 69 74 65 33 52 65 6e 61  CT ) sqlite3Rena
95d0: 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73  meTokenMap(pPars
95e0: 65 2c 20 28 76 6f 69 64 2a 29 7a 2c 20 70 4e 61  e, (void*)z, pNa
95f0: 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  me);.  memcpy(z,
9600: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
9610: 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d  ->n);.  z[pName-
9620: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >n] = 0;.  sqlit
9630: 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  e3Dequote(z);.  
9640: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
9650: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
9660: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
9670: 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  p(z, p->aCol[i].
9680: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
9690: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
96a0: 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c  sg(pParse, "dupl
96b0: 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  icate column nam
96c0: 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  e: %s", z);.    
96d0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
96e0: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65  db, z);.      re
96f0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
9700: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
9710: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
9720: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
9730: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
9740: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e  DbRealloc(db,p->
9750: 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29  aCol,(p->nCol+8)
9760: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b  *sizeof(p->aCol[
9770: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  0]));.    if( aN
9780: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
9790: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
97a0: 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   z);.      retur
97b0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  n;.    }.    p->
97c0: 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d  aCol = aNew;.  }
97d0: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
97e0: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d  ol[p->nCol];.  m
97f0: 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73  emset(pCol, 0, s
9800: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
9810: 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  ));.  pCol->zNam
9820: 65 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33  e = z;.  sqlite3
9830: 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73  ColumnProperties
9840: 46 72 6f 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c  FromName(p, pCol
9850: 29 3b 0a 20 0a 20 20 69 66 28 20 70 54 79 70 65  );. .  if( pType
9860: 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ->n==0 ){.    /*
9870: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
9880: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
9890: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
98a0: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
98b0: 79 0a 20 20 20 20 2a 2a 20 27 42 4c 4f 42 27 20  y.    ** 'BLOB' 
98c0: 77 69 74 68 20 61 20 64 65 66 61 75 6c 74 20 73  with a default s
98d0: 69 7a 65 20 6f 66 20 34 20 62 79 74 65 73 2e 20  ize of 4 bytes. 
98e0: 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  */.    pCol->aff
98f0: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
9900: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f  FF_BLOB;.    pCo
9910: 6c 2d 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 23 69  l->szEst = 1;.#i
9920: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
9930: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
9940: 4e 43 45 53 0a 20 20 20 20 69 66 28 20 34 3e 3d  NCES.    if( 4>=
9950: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
9960: 66 69 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20  fig.szSorterRef 
9970: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63  ){.      pCol->c
9980: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
9990: 41 47 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20  AG_SORTERREF;.  
99a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c    }.#endif.  }el
99b0: 73 65 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20  se{.    zType = 
99c0: 7a 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65  z + sqlite3Strle
99d0: 6e 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20 20 20  n30(z) + 1;.    
99e0: 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 70 54  memcpy(zType, pT
99f0: 79 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e  ype->z, pType->n
9a00: 29 3b 0a 20 20 20 20 7a 54 79 70 65 5b 70 54 79  );.    zType[pTy
9a10: 70 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  pe->n] = 0;.    
9a20: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
9a30: 54 79 70 65 29 3b 0a 20 20 20 20 70 43 6f 6c 2d  Type);.    pCol-
9a40: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
9a50: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
9a60: 7a 54 79 70 65 2c 20 70 43 6f 6c 29 3b 0a 20 20  zType, pCol);.  
9a70: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
9a80: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54   |= COLFLAG_HAST
9a90: 59 50 45 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43  YPE;.  }.  p->nC
9aa0: 6f 6c 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e  ol++;.  pParse->
9ab0: 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e  constraintName.n
9ac0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
9ad0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
9ae0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
9af0: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
9b00: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
9b10: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
9b20: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
9b30: 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   A "NOT NULL" co
9b40: 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20  nstraint has.** 
9b50: 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63  been seen on a c
9b60: 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75  olumn.  This rou
9b70: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f  tine sets the no
9b80: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a  tNull flag on.**
9b90: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
9ba0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
9bb0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
9bc0: 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e  d sqlite3AddNotN
9bd0: 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73  ull(Parse *pPars
9be0: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
9bf0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
9c00: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 70  olumn *pCol;.  p
9c10: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
9c20: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
9c30: 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f   || NEVER(p->nCo
9c40: 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  l<1) ) return;. 
9c50: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
9c60: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 70  [p->nCol-1];.  p
9c70: 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3d 20 28  Col->notNull = (
9c80: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 2d  u8)onError;.  p-
9c90: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
9ca0: 48 61 73 4e 6f 74 4e 75 6c 6c 3b 0a 0a 20 20 2f  HasNotNull;..  /
9cb0: 2a 20 53 65 74 20 74 68 65 20 75 6e 69 71 4e 6f  * Set the uniqNo
9cc0: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 20 61 6e  tNull flag on an
9cd0: 79 20 55 4e 49 51 55 45 20 6f 72 20 50 4b 20 69  y UNIQUE or PK i
9ce0: 6e 64 65 78 65 73 20 61 6c 72 65 61 64 79 20 63  ndexes already c
9cf0: 72 65 61 74 65 64 0a 20 20 2a 2a 20 6f 6e 20 74  reated.  ** on t
9d00: 68 69 73 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a  his column.  */.
9d10: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 63 6f 6c 46    if( pCol->colF
9d20: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 55  lags & COLFLAG_U
9d30: 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 49 6e 64  NIQUE ){.    Ind
9d40: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
9d50: 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78  r(pIdx=p->pIndex
9d60: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
9d70: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
9d80: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
9d90: 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20 70 49 64  KeyCol==1 && pId
9da0: 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
9db0: 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  one );.      if(
9dc0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
9dd0: 30 5d 3d 3d 70 2d 3e 6e 43 6f 6c 2d 31 20 29 7b  0]==p->nCol-1 ){
9de0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 75  .        pIdx->u
9df0: 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a  niqNotNull = 1;.
9e00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9e10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  }.}../*.** Scan 
9e20: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
9e30: 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67  name zType (leng
9e40: 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65  th nType) and re
9e50: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f  turn the.** asso
9e60: 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20  ciated affinity 
9e70: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  type..**.** This
9e80: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20   routine does a 
9e90: 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74  case-independent
9ea0: 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65   search of zType
9eb0: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62   for the .** sub
9ec0: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66  strings in the f
9ed0: 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20  ollowing table. 
9ee0: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  If one of the su
9ef0: 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66  bstrings is.** f
9f00: 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73  ound, the corres
9f10: 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79  ponding affinity
9f20: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
9f30: 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a   zType contains.
9f40: 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ** more than one
9f50: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
9f60: 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61  gs, entries towa
9f70: 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a  rd the top of .*
9f80: 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65  * the table take
9f90: 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65   priority. For e
9fa0: 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65  xample, if zType
9fb0: 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a   is 'BLOBINT', .
9fc0: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  ** SQLITE_AFF_IN
9fd0: 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65  TEGER is returne
9fe0: 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69  d..**.** Substri
9ff0: 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74  ng     | Affinit
a000: 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  y.** -----------
a010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a020: 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20  -----.** 'INT'  
a030: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
a040: 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27  AFF_INTEGER.** '
a050: 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53  CHAR'        | S
a060: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
a070: 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'CLOB'        
a080: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
a090: 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20  T.** 'TEXT'     
a0a0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
a0b0: 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20  TEXT.** 'BLOB'  
a0c0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
a0d0: 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52 45 41 4c  FF_BLOB.** 'REAL
a0e0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
a0f0: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46  E_AFF_REAL.** 'F
a100: 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOA'        | SQ
a110: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
a120: 20 27 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c   'DOUB'        |
a130: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
a140: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f  .**.** If none o
a150: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
a160: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61   in the above ta
a170: 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a  ble are found,.*
a180: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  * SQLITE_AFF_NUM
a190: 45 52 49 43 20 69 73 20 72 65 74 75 72 6e 65 64  ERIC is returned
a1a0: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
a1b0: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f  3AffinityType(co
a1c0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 43  nst char *zIn, C
a1d0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20  olumn *pCol){.  
a1e0: 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61  u32 h = 0;.  cha
a1f0: 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41  r aff = SQLITE_A
a200: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f  FF_NUMERIC;.  co
a210: 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20  nst char *zChar 
a220: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
a230: 7a 49 6e 21 3d 30 20 29 3b 0a 20 20 77 68 69 6c  zIn!=0 );.  whil
a240: 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20  e( zIn[0] ){.   
a250: 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71   h = (h<<8) + sq
a260: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
a270: 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a  r[(*zIn)&0xff];.
a280: 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69      zIn++;.    i
a290: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
a2a0: 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('h'<<16)+('a'<
a2b0: 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20  <8)+'r') ){     
a2c0: 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20          /* CHAR 
a2d0: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
a2e0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
a2f0: 20 20 20 20 20 20 7a 43 68 61 72 20 3d 20 7a 49        zChar = zI
a300: 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  n;.    }else if(
a310: 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28   h==(('c'<<24)+(
a320: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
a330: 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20  )+'b') ){       
a340: 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  /* CLOB */.     
a350: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
a360: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
a370: 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c  e if( h==(('t'<<
a380: 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27  24)+('e'<<16)+('
a390: 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  x'<<8)+'t') ){  
a3a0: 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a       /* TEXT */.
a3b0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
a3c0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
a3d0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
a3e0: 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'b'<<24)+('l'<<1
a3f0: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
a400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f            /* BLO
a410: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
a420: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
a430: 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d  _NUMERIC || aff=
a440: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
a450: 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  ) ){.      aff =
a460: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
a470: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b  ;.      if( zIn[
a480: 30 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61 72 20  0]=='(' ) zChar 
a490: 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53  = zIn;.#ifndef S
a4a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
a4b0: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65  ING_POINT.    }e
a4c0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27  lse if( h==(('r'
a4d0: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
a4e0: 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20  ('a'<<8)+'l')   
a4f0: 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a         /* REAL *
a500: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
a510: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
a520: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
a530: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
a540: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
a550: 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29  f( h==(('f'<<24)
a560: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
a570: 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20  <8)+'a')        
a580: 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20    /* FLOA */.   
a590: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
a5a0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
a5b0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
a5c0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
a5d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
a5e0: 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27  =(('d'<<24)+('o'
a5f0: 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27  <<16)+('u'<<8)+'
a600: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
a610: 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  DOUB */.        
a620: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
a630: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
a640: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
a650: 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69  _AFF_REAL;.#endi
a660: 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  f.    }else if( 
a670: 28 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d  (h&0x00FFFFFF)==
a680: 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c  (('i'<<16)+('n'<
a690: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f  <8)+'t') ){    /
a6a0: 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61  * INT */.      a
a6b0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
a6c0: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62  INTEGER;.      b
a6d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
a6e0: 0a 20 20 2f 2a 20 49 66 20 70 43 6f 6c 20 69 73  .  /* If pCol is
a6f0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65   not NULL, store
a700: 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
a710: 74 68 65 20 66 69 65 6c 64 20 73 69 7a 65 2e 20  the field size. 
a720: 20 54 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61   The.  ** estima
a730: 74 65 20 69 73 20 73 63 61 6c 65 64 20 73 6f 20  te is scaled so 
a740: 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
a750: 20 61 6e 20 69 6e 74 65 67 65 72 20 69 73 20 31   an integer is 1
a760: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c  .  */.  if( pCol
a770: 20 29 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20   ){.    int v = 
a780: 30 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c 74 20  0;   /* default 
a790: 73 69 7a 65 20 69 73 20 61 70 70 72 6f 78 20 34  size is approx 4
a7a0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 66   bytes */.    if
a7b0: 28 20 61 66 66 3c 53 51 4c 49 54 45 5f 41 46 46  ( aff<SQLITE_AFF
a7c0: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
a7d0: 20 20 69 66 28 20 7a 43 68 61 72 20 29 7b 0a 20    if( zChar ){. 
a7e0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43         while( zC
a7f0: 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  har[0] ){.      
a800: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
a810: 73 64 69 67 69 74 28 7a 43 68 61 72 5b 30 5d 29  sdigit(zChar[0])
a820: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a830: 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43  /* BLOB(k), VARC
a840: 48 41 52 28 6b 29 2c 20 43 48 41 52 28 6b 29 20  HAR(k), CHAR(k) 
a850: 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a  -> r=(k/4+1) */.
a860: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a870: 74 65 33 47 65 74 49 6e 74 33 32 28 7a 43 68 61  te3GetInt32(zCha
a880: 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20  r, &v);.        
a890: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a8a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
a8b0: 20 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20   zChar++;.      
a8c0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
a8d0: 0a 20 20 20 20 20 20 20 20 76 20 3d 20 31 36 3b  .        v = 16;
a8e0: 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54     /* BLOB, TEXT
a8f0: 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28  , CLOB -> r=5  (
a900: 61 70 70 72 6f 78 20 32 30 20 62 79 74 65 73 29  approx 20 bytes)
a910: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
a920: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
a930: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
a940: 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
a950: 76 3e 3d 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  v>=sqlite3Global
a960: 43 6f 6e 66 69 67 2e 73 7a 53 6f 72 74 65 72 52  Config.szSorterR
a970: 65 66 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  ef ){.      pCol
a980: 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
a990: 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52 45 46 3b  LFLAG_SORTERREF;
a9a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
a9b0: 20 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20    v = v/4 + 1;. 
a9c0: 20 20 20 69 66 28 20 76 3e 32 35 35 20 29 20 76     if( v>255 ) v
a9d0: 20 3d 20 32 35 35 3b 0a 20 20 20 20 70 43 6f 6c   = 255;.    pCol
a9e0: 2d 3e 73 7a 45 73 74 20 3d 20 76 3b 0a 20 20 7d  ->szEst = v;.  }
a9f0: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
aa00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ../*.** The expr
aa10: 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65  ession is the de
aa20: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
aa30: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
aa40: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a  y added column.*
aa50: 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
aa60: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
aa70: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  onstruction..**.
aa80: 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  ** Default value
aa90: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
aaa0: 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20  t be constant.  
aab0: 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69  Raise an excepti
aac0: 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  on if this.** is
aad0: 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a   not the case..*
aae0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
aaf0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
ab00: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
ab10: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
ab20: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
ab30: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
ab40: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
ab50: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
ab60: 61 6c 75 65 28 0a 20 20 50 61 72 73 65 20 2a 70  alue(.  Parse *p
ab70: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
ab80: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
ab90: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
aba0: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
abb0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20    /* The parsed 
abc0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68  expression of th
abd0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
abe0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
abf0: 2a 7a 53 74 61 72 74 2c 20 20 20 20 20 20 2f 2a  *zStart,      /*
ac00: 20 53 74 61 72 74 20 6f 66 20 74 68 65 20 64 65   Start of the de
ac10: 66 61 75 6c 74 20 76 61 6c 75 65 20 74 65 78 74  fault value text
ac20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
ac30: 20 2a 7a 45 6e 64 20 20 20 20 20 20 20 20 20 2f   *zEnd         /
ac40: 2a 20 46 69 72 73 74 20 63 68 61 72 61 63 74 65  * First characte
ac50: 72 20 70 61 73 74 20 65 6e 64 20 6f 66 20 64 65  r past end of de
ac60: 66 61 75 74 20 76 61 6c 75 65 20 74 65 78 74 20  faut value text 
ac70: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
ac80: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
ac90: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
aca0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
acb0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
acc0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d  Table;.  if( p!=
acd0: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20  0 ){.    pCol = 
ace0: 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f  &(p->aCol[p->nCo
acf0: 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21  l-1]);.    if( !
ad00: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
ad10: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
ad20: 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69 74 2e  pExpr, db->init.
ad30: 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73  busy) ){.      s
ad40: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
ad50: 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20  Parse, "default 
ad60: 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20  value of column 
ad70: 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73  [%s] is not cons
ad80: 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20  tant",.         
ad90: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
ada0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
adb0: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78  /* A copy of pEx
adc0: 70 72 20 69 73 20 75 73 65 64 20 69 6e 73 74 65  pr is used inste
add0: 61 64 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ad of the origin
ade0: 61 6c 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e  al, as pExpr con
adf0: 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74  tains.      ** t
ae00: 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74  okens that point
ae10: 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d   to volatile mem
ae20: 6f 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ory..      */.  
ae30: 20 20 20 20 45 78 70 72 20 78 3b 0a 20 20 20 20      Expr x;.    
ae40: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
ae50: 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44  ete(db, pCol->pD
ae60: 66 6c 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  flt);.      mems
ae70: 65 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&x, 0, sizeof
ae80: 28 78 29 29 3b 0a 20 20 20 20 20 20 78 2e 6f 70  (x));.      x.op
ae90: 20 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20 20 20 20   = TK_SPAN;.    
aea0: 20 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73    x.u.zToken = s
aeb0: 71 6c 69 74 65 33 44 62 53 70 61 6e 44 75 70 28  qlite3DbSpanDup(
aec0: 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64  db, zStart, zEnd
aed0: 29 3b 0a 20 20 20 20 20 20 78 2e 70 4c 65 66 74  );.      x.pLeft
aee0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
aef0: 78 2e 66 6c 61 67 73 20 3d 20 45 50 5f 53 6b 69  x.flags = EP_Ski
af00: 70 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70  p;.      pCol->p
af10: 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Dflt = sqlite3Ex
af20: 70 72 44 75 70 28 64 62 2c 20 26 78 2c 20 45 58  prDup(db, &x, EX
af30: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
af40: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
af50: 65 65 28 64 62 2c 20 78 2e 75 2e 7a 54 6f 6b 65  ee(db, x.u.zToke
af60: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
af70: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
af80: 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69  JECT ){.    sqli
af90: 74 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d  te3RenameExprUnm
afa0: 61 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ap(pParse, pExpr
afb0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
afc0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
afd0: 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
afe0: 42 61 63 6b 77 61 72 64 73 20 43 6f 6d 70 61 74  Backwards Compat
aff0: 69 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a 2a 2a  ibility Hack:.**
b000: 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 20   .** Historical 
b010: 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
b020: 74 65 20 61 63 63 65 70 74 65 64 20 73 74 72 69  te accepted stri
b030: 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20 6e 61  ngs as column na
b040: 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65 78 65  mes in.** indexe
b050: 73 20 61 6e 64 20 50 52 49 4d 41 52 59 20 4b 45  s and PRIMARY KE
b060: 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e  Y constraints an
b070: 64 20 69 6e 20 55 4e 49 51 55 45 20 63 6f 6e 73  d in UNIQUE cons
b080: 74 72 61 69 6e 74 73 2e 20 20 45 78 61 6d 70 6c  traints.  Exampl
b090: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45  e:.**.**     CRE
b0a0: 41 54 45 20 54 41 42 4c 45 20 78 79 7a 28 61 2c  ATE TABLE xyz(a,
b0b0: 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52 59 20  b,c,d,e,PRIMARY 
b0c0: 4b 45 59 28 27 61 27 29 2c 55 4e 49 51 55 45 28  KEY('a'),UNIQUE(
b0d0: 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54 45 20  'b','c' COLLATE 
b0e0: 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43 52 45  trim).**     CRE
b0f0: 41 54 45 20 49 4e 44 45 58 20 61 62 63 20 4f 4e  ATE INDEX abc ON
b100: 20 78 79 7a 28 27 63 27 2c 27 64 27 20 44 45 53   xyz('c','d' DES
b110: 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20 6e 6f  C,'e' COLLATE no
b120: 63 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a 0a 2a  case DESC);.**.*
b130: 2a 20 54 68 69 73 20 69 73 20 67 6f 6f 66 79 2e  * This is goofy.
b140: 20 20 42 75 74 20 74 6f 20 70 72 65 73 65 72 76    But to preserv
b150: 65 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  e backwards comp
b160: 61 74 69 62 69 6c 69 74 79 20 77 65 20 63 6f 6e  atibility we con
b170: 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63 63 65  tinue to.** acce
b180: 70 74 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75  pt it.  This rou
b190: 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 6e 65  tine does the ne
b1a0: 63 65 73 73 61 72 79 20 63 6f 6e 76 65 72 73 69  cessary conversi
b1b0: 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72 74 73  on.  It converts
b1c0: 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
b1d0: 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69 74 73 20  on given in its 
b1e0: 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20 61 20  argument from a 
b1f0: 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f 20 61  TK_STRING into a
b200: 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74 68 65   TK_ID.** if the
b210: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6a   expression is j
b220: 75 73 74 20 61 20 54 4b 5f 53 54 52 49 4e 47 20  ust a TK_STRING 
b230: 77 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e 61 6c  with an optional
b240: 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 2e   COLLATE clause.
b250: 0a 2a 2a 20 49 66 20 74 68 65 20 65 70 78 72 65  .** If the epxre
b260: 73 73 69 6f 6e 20 69 73 20 61 6e 79 74 68 69 6e  ssion is anythin
b270: 67 20 6f 74 68 65 72 20 74 68 61 6e 20 54 4b 5f  g other than TK_
b280: 53 54 52 49 4e 47 2c 20 74 68 65 20 65 78 70 72  STRING, the expr
b290: 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e 63  ession is.** unc
b2a0: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  hanged..*/.stati
b2b0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  c void sqlite3St
b2c0: 72 69 6e 67 54 6f 49 64 28 45 78 70 72 20 2a 70  ringToId(Expr *p
b2d0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  ){.  if( p->op==
b2e0: 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  TK_STRING ){.   
b2f0: 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a   p->op = TK_ID;.
b300: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f    }else if( p->o
b310: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26  p==TK_COLLATE &&
b320: 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   p->pLeft->op==T
b330: 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20  K_STRING ){.    
b340: 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d 20 54  p->pLeft->op = T
b350: 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  K_ID;.  }.}../*.
b360: 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65  ** Designate the
b370: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72   PRIMARY KEY for
b380: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69   the table.  pLi
b390: 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
b3a0: 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c  names .** of col
b3b0: 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74  umns that form t
b3c0: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  he primary key. 
b3d0: 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c   If pList is NUL
b3e0: 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d  L, then the.** m
b3f0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
b400: 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ed column of the
b410: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72   table is the pr
b420: 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  imary key..**.**
b430: 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76   A table can hav
b440: 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72  e at most one pr
b450: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74  imary key.  If t
b460: 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
b470: 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72   has.** a primar
b480: 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20  y key (and this 
b490: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72  is the second pr
b4a0: 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20  imary key) then 
b4b0: 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72  create an.** err
b4c0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  or..**.** If the
b4d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20   PRIMARY KEY is 
b4e0: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  on a single colu
b4f0: 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70  mn whose datatyp
b500: 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a  e is INTEGER,.**
b510: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72   then we will tr
b520: 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f  y to use that co
b530: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69  lumn as the rowi
b540: 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62 6c  d.  Set the Tabl
b550: 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64  e.iPKey.** field
b560: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e   of the table un
b570: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
b580: 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78   to be the index
b590: 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47   of the.** INTEG
b5a0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
b5b0: 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50  olumn.  Table.iP
b5c0: 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31  Key is set to -1
b5d0: 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   if there is.** 
b5e0: 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
b5f0: 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66  RY KEY..**.** If
b600: 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20   the key is not 
b610: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
b620: 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65  RY KEY, then cre
b630: 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20  ate a unique.** 
b640: 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65  index for the ke
b650: 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20  y.  No index is 
b660: 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45  created for INTE
b670: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73  GER PRIMARY KEYs
b680: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b690: 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a  3AddPrimaryKey(.
b6a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
b6b0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
b6c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
b6d0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a  List *pList,  /*
b6e0: 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e   List of field n
b6f0: 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78  ames to be index
b700: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
b710: 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61  ror,      /* Wha
b720: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75  t to do with a u
b730: 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69  niqueness confli
b740: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f  ct */.  int auto
b750: 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  Inc,      /* Tru
b760: 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43  e if the AUTOINC
b770: 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69  REMENT keyword i
b780: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
b790: 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20  nt sortOrder    
b7a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53   /* SQLITE_SO_AS
b7b0: 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44  C or SQLITE_SO_D
b7c0: 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ESC */.){.  Tabl
b7d0: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
b7e0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 43  ->pNewTable;.  C
b7f0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b  olumn *pCol = 0;
b800: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
b810: 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d  , i;.  int nTerm
b820: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
b830: 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b  ) goto primary_k
b840: 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70  ey_exit;.  if( p
b850: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
b860: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
b870: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
b880: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
b890: 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22  .      "table \"
b8a0: 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68  %s\" has more th
b8b0: 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  an one primary k
b8c0: 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ey", pTab->zName
b8d0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d  );.    goto prim
b8e0: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
b8f0: 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  }.  pTab->tabFla
b900: 67 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d  gs |= TF_HasPrim
b910: 61 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c  aryKey;.  if( pL
b920: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43  ist==0 ){.    iC
b930: 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  ol = pTab->nCol 
b940: 2d 20 31 3b 0a 20 20 20 20 70 43 6f 6c 20 3d 20  - 1;.    pCol = 
b950: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
b960: 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c  ];.    pCol->col
b970: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
b980: 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 6e 54  _PRIMKEY;.    nT
b990: 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  erm = 1;.  }else
b9a0: 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c  {.    nTerm = pL
b9b0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
b9c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d  for(i=0; i<nTerm
b9d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
b9e0: 70 72 20 2a 70 43 45 78 70 72 20 3d 20 73 71 6c  pr *pCExpr = sql
b9f0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
ba00: 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ate(pList->a[i].
ba10: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 61 73  pExpr);.      as
ba20: 73 65 72 74 28 20 70 43 45 78 70 72 21 3d 30 20  sert( pCExpr!=0 
ba30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ba40: 53 74 72 69 6e 67 54 6f 49 64 28 70 43 45 78 70  StringToId(pCExp
ba50: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  r);.      if( pC
ba60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
ba70: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
ba80: 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65 20 3d 20   char *zCName = 
ba90: 70 43 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  pCExpr->u.zToken
baa0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 43  ;.        for(iC
bab0: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
bac0: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
bad0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
bae0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 4e  lite3StrICmp(zCN
baf0: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
bb00: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  iCol].zName)==0 
bb10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
bb20: 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
bb30: 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20  l[iCol];.       
bb40: 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c       pCol->colFl
bb50: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50  ags |= COLFLAG_P
bb60: 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20  RIMKEY;.        
bb70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bb80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
bb90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bba0: 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d   }.  if( nTerm==
bbb0: 31 0a 20 20 20 26 26 20 70 43 6f 6c 0a 20 20 20  1.   && pCol.   
bbc0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
bbd0: 70 28 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54  p(sqlite3ColumnT
bbe0: 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 20 22 49  ype(pCol,""), "I
bbf0: 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 26  NTEGER")==0.   &
bc00: 26 20 73 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c  & sortOrder!=SQL
bc10: 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20 29 7b  ITE_SO_DESC.  ){
bc20: 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  .    if( IN_RENA
bc30: 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 4c 69  ME_OBJECT && pLi
bc40: 73 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  st ){.      sqli
bc50: 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65  te3RenameTokenRe
bc60: 6d 61 70 28 70 50 61 72 73 65 2c 20 26 70 54 61  map(pParse, &pTa
bc70: 62 2d 3e 69 50 4b 65 79 2c 20 70 4c 69 73 74 2d  b->iPKey, pList-
bc80: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
bc90: 20 20 7d 0a 20 20 20 20 70 54 61 62 2d 3e 69 50    }.    pTab->iP
bca0: 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  Key = iCol;.    
bcb0: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20  pTab->keyConf = 
bcc0: 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  (u8)onError;.   
bcd0: 20 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63   assert( autoInc
bce0: 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d  ==0 || autoInc==
bcf0: 31 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74  1 );.    pTab->t
bd00: 61 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49  abFlags |= autoI
bd10: 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d  nc*TF_Autoincrem
bd20: 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ent;.    if( pLi
bd30: 73 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b  st ) pParse->iPk
bd40: 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73  SortOrder = pLis
bd50: 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
bd60: 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  r;.  }else if( a
bd70: 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65  utoInc ){.#ifnde
bd80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
bd90: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
bda0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
bdb0: 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43  pParse, "AUTOINC
bdc0: 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61  REMENT is only a
bdd0: 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20  llowed on an ". 
bde0: 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50        "INTEGER P
bdf0: 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65  RIMARY KEY");.#e
be00: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
be10: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49    sqlite3CreateI
be20: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
be30: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45  0, 0, pList, onE
be40: 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20  rror, 0,.       
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be60: 20 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72      0, sortOrder
be70: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 49 44 58 54  , 0, SQLITE_IDXT
be80: 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b  YPE_PRIMARYKEY);
be90: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
bea0: 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79    }..primary_key
beb0: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
bec0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
bed0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74  Parse->db, pList
bee0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
bef0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
bf00: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
bf10: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
bf20: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
bf30: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
bf40: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68  oid sqlite3AddCh
bf50: 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  eckConstraint(. 
bf60: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
bf70: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
bf80: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
bf90: 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20  *pCheckExpr  /* 
bfa0: 54 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73  The check expres
bfb0: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  sion */.){.#ifnd
bfc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
bfd0: 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54  HECK.  Table *pT
bfe0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
bff0: 77 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65  wTable;.  sqlite
c000: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
c010: 64 62 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26  db;.  if( pTab &
c020: 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  & !IN_DECLARE_VT
c030: 41 42 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65  AB.   && !sqlite
c040: 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79  3BtreeIsReadonly
c050: 28 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69  (db->aDb[db->ini
c060: 74 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b  t.iDb].pBt).  ){
c070: 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63  .    pTab->pChec
c080: 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  k = sqlite3ExprL
c090: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
c0a0: 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20  , pTab->pCheck, 
c0b0: 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20  pCheckExpr);.   
c0c0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e   if( pParse->con
c0d0: 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b  straintName.n ){
c0e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
c0f0: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
c100: 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65  arse, pTab->pChe
c110: 63 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e  ck, &pParse->con
c120: 73 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b  straintName, 1);
c130: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
c140: 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
c150: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
c160: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65  pParse->db, pChe
c170: 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  ckExpr);.  }.}..
c180: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
c190: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
c1a0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
c1b0: 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62  ently parsed tab
c1c0: 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20  le column.** to 
c1d0: 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65  the CollSeq give
c1e0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
c1f0: 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  e3AddCollateType
c200: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c210: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
c220: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
c230: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  t i;.  char *zCo
c240: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
c250: 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d   /* Dequoted nam
c260: 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  e of collation s
c270: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c  equence */.  sql
c280: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
c290: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
c2a0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
c2b0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
c2c0: 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50  Col-1;.  db = pP
c2d0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c  arse->db;.  zCol
c2e0: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
c2f0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
c300: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f  ken);.  if( !zCo
c310: 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  ll ) return;..  
c320: 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  if( sqlite3Locat
c330: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
c340: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49   zColl) ){.    I
c350: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
c360: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
c370: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  , p->aCol[i].zCo
c380: 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c  ll);.    p->aCol
c390: 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c  [i].zColl = zCol
c3a0: 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  l;.  .    /* If 
c3b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65  the column is de
c3c0: 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65  clared as "<name
c3d0: 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f  > PRIMARY KEY CO
c3e0: 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20  LLATE <type>",. 
c3f0: 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e     ** then an in
c400: 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65  dex may have bee
c410: 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69  n created on thi
c420: 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20  s column before 
c430: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61  the.    ** colla
c440: 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64  tion type was ad
c450: 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69  ded. Correct thi
c460: 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63  s if it is the c
c470: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
c480: 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
c490: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
c4a0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
c4b0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
c4c0: 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20  >nKeyCol==1 );. 
c4d0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
c4e0: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b  iColumn[0]==i ){
c4f0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
c500: 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43  zColl[0] = p->aC
c510: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[i].zColl;.   
c520: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
c530: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
c540: 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
c550: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
c560: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
c570: 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  urns the collati
c580: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
c590: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
c5a0: 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67  text.** encoding
c5b0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
c5c0: 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c  he string zName,
c5d0: 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a   length nName..*
c5e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
c5f0: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ested collation 
c600: 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20  sequence is not 
c610: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f  available, or no
c620: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69  t available.** i
c630: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  n the database n
c640: 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20  ative encoding, 
c650: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
c660: 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64  ctory is invoked
c670: 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69   to.** request i
c680: 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  t. If the collat
c690: 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73  ion factory does
c6a0: 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68   not supply such
c6b0: 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20   a sequence,.** 
c6c0: 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65  and the sequence
c6d0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
c6e0: 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e   another text en
c6f0: 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61  coding, then tha
c700: 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  t is.** returned
c710: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
c720: 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f  If no versions o
c730: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
c740: 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65  collations seque
c750: 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c  nce are availabl
c760: 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72  e, or.** another
c770: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
c780: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
c790: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
c7a0: 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74  sage written int
c7b0: 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  o.** pParse..**.
c7c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c7d0: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
c7e0: 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43  und sqlite3FindC
c7f0: 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20  ollSeq().  This 
c800: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b  routine.** invok
c810: 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
c820: 20 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20   factory if the 
c830: 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  named collation 
c840: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a  cannot be found.
c850: 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ** and generates
c860: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
c870: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
c880: 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  o: sqlite3FindCo
c890: 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33  llSeq(), sqlite3
c8a0: 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a  GetCollSeq().*/.
c8b0: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
c8c0: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61  LocateCollSeq(Pa
c8d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
c8e0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
c8f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c900: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75   pParse->db;.  u
c910: 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
c920: 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d  .  u8 initbusy =
c930: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a   db->init.busy;.
c940: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
c950: 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  ;..  pColl = sql
c960: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
c970: 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20  db, enc, zName, 
c980: 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28  initbusy);.  if(
c990: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
c9a0: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
c9b0: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43  >xCmp) ){.    pC
c9c0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
c9d0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
c9e0: 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d  enc, pColl, zNam
c9f0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  e);.  }..  retur
ca00: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pColl;.}.../*.
ca10: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
ca20: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
ca30: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
ca40: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
ca50: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
ca60: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
ca70: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
ca80: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
ca90: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
caa0: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
cab0: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
cac0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
cad0: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
cae0: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
caf0: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
cb00: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
cb10: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
cb20: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
cb30: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
cb40: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
cb50: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
cb60: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
cb70: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
cb80: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
cb90: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
cba0: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
cbb0: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
cbc0: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
cbd0: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
cbe0: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
cbf0: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
cc00: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
cc10: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
cc20: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
cc30: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
cc40: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
cc50: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
cc60: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
cc70: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
cc80: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
cc90: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
cca0: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
ccb0: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
ccc0: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
ccd0: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a  fe enough..**.**
cce0: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
ccf0: 4f 46 3a 20 52 2d 33 34 32 33 30 2d 35 36 30 34  OF: R-34230-5604
cd00: 39 20 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74  9 SQLite automat
cd10: 69 63 61 6c 6c 79 20 69 6e 63 72 65 6d 65 6e 74  ically increment
cd20: 73 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d  s.** the schema-
cd30: 76 65 72 73 69 6f 6e 20 77 68 65 6e 65 76 65 72  version whenever
cd40: 20 74 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e   the schema chan
cd50: 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ges..*/.void sql
cd60: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
cd70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
cd80: 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69  int iDb){.  sqli
cd90: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
cda0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
cdb0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
cdc0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
cdd0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
cde0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
cdf0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
ce00: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
ce10: 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45  okie, iDb, BTREE
ce20: 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c  _SCHEMA_VERSION,
ce30: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
ce40: 20 20 20 20 20 28 69 6e 74 29 28 31 2b 28 75 6e       (int)(1+(un
ce50: 73 69 67 6e 65 64 29 64 62 2d 3e 61 44 62 5b 69  signed)db->aDb[i
ce60: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68  Db].pSchema->sch
ce70: 65 6d 61 5f 63 6f 6f 6b 69 65 29 29 3b 0a 7d 0a  ema_cookie));.}.
ce80: 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74  ./*.** Measure t
ce90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
cea0: 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74  racters needed t
ceb0: 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76  o output the giv
cec0: 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  en.** identifier
ced0: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65  .  The number re
cee0: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
cef0: 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a  any quotes used.
cf00: 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ** but does not 
cf10: 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c  include the null
cf20: 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a   terminator..**.
cf30: 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20  ** The estimate 
cf40: 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e  is conservative.
cf50: 20 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61    It might be la
cf60: 72 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69  rger that what i
cf70: 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64  s.** really need
cf80: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
cf90: 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f  t identLength(co
cfa0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
cfb0: 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30  int n;.  for(n=0
cfc0: 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b  ; *z; n++, z++){
cfd0: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27  .    if( *z=='"'
cfe0: 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20   ){ n++; }.  }. 
cff0: 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d   return n + 2;.}
d000: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
d010: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  t parameter is a
d020: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
d030: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68  utput buffer. Th
d040: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72  e second .** par
d050: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
d060: 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ter to an intege
d070: 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  r that contains 
d080: 74 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a  the offset at.**
d090: 20 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20   which to write 
d0a0: 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  into the output 
d0b0: 62 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e  buffer. This fun
d0c0: 63 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65  ction copies the
d0d0: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
d0e0: 65 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65  ed string pointe
d0f0: 64 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72  d to by the thir
d100: 64 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69  d parameter, zSi
d110: 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f  gnedIdent,.** to
d120: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f   the specified o
d130: 66 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66  ffset in the buf
d140: 66 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20  fer and updates 
d150: 2a 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a  *pIdx to refer.*
d160: 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  * to the first b
d170: 79 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61  yte after the la
d180: 73 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  st byte written 
d190: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
d1a0: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
d1b0: 73 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64  string zSignedId
d1c0: 65 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  ent consists ent
d1d0: 69 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e  irely of alpha-n
d1e0: 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63  umeric.** charac
d1f0: 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62  ters, does not b
d200: 65 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69  egin with a digi
d210: 74 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20  t and is not an 
d220: 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20  SQL keyword,.** 
d230: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65  then it is copie
d240: 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  d to the output 
d250: 62 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61  buffer exactly a
d260: 73 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69  s it is. Otherwi
d270: 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f  se,.** it is quo
d280: 74 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65  ted using double
d290: 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  -quotes..*/.stat
d2a0: 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74  ic void identPut
d2b0: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70  (char *z, int *p
d2c0: 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e  Idx, char *zSign
d2d0: 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69  edIdent){.  unsi
d2e0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e  gned char *zIden
d2f0: 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  t = (unsigned ch
d300: 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar*)zSignedIdent
d310: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65  ;.  int i, j, ne
d320: 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a  edQuote;.  i = *
d330: 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30  pIdx;..  for(j=0
d340: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
d350: 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  ){.    if( !sqli
d360: 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e  te3Isalnum(zIden
d370: 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b  t[j]) && zIdent[
d380: 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b  j]!='_' ) break;
d390: 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65  .  }.  needQuote
d3a0: 20 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69   = sqlite3Isdigi
d3b0: 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20  t(zIdent[0]).   
d3c0: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
d3d0: 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a  te3KeywordCode(z
d3e0: 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44  Ident, j)!=TK_ID
d3f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
d400: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20  zIdent[j]!=0.   
d410: 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30           || j==0
d420: 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f  ;..  if( needQuo
d430: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
d440: 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ';.  for(j=0; zI
d450: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
d460: 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65     z[i++] = zIde
d470: 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a  nt[j];.    if( z
d480: 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20  Ident[j]=='"' ) 
d490: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
d4a0: 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  }.  if( needQuot
d4b0: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
d4c0: 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20  ;.  z[i] = 0;.  
d4d0: 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a  *pIdx = i;.}../*
d4e0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43  .** Generate a C
d4f0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
d500: 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74  ement appropriat
d510: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
d520: 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72  ** table.  Memor
d530: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65  y to hold the te
d540: 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  xt of the statem
d550: 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ent is obtained.
d560: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ** from sqliteMa
d570: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
d580: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
d590: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
d5a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
d5b0: 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d   *createTableStm
d5c0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  t(sqlite3 *db, T
d5d0: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
d5e0: 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20  i, k, n;.  char 
d5f0: 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *zStmt;.  char *
d600: 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a  zSep, *zSep2, *z
d610: 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  End;.  Column *p
d620: 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  Col;.  n = 0;.  
d630: 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43  for(pCol = p->aC
d640: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
d650: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
d660: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
d670: 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61  Length(pCol->zNa
d680: 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e  me) + 5;.  }.  n
d690: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
d6a0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  p->zName);.  if(
d6b0: 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53   n<50 ){ .    zS
d6c0: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65  ep = "";.    zSe
d6d0: 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45  p2 = ",";.    zE
d6e0: 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73  nd = ")";.  }els
d6f0: 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  e{.    zSep = "\
d700: 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  n  ";.    zSep2 
d710: 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a  = ",\n  ";.    z
d720: 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d  End = "\n)";.  }
d730: 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70  .  n += 35 + 6*p
d740: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20  ->nCol;.  zStmt 
d750: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
d760: 63 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66  cRaw(0, n);.  if
d770: 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  ( zStmt==0 ){.  
d780: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
d790: 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72  t(db);.    retur
d7a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
d7b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a  e3_snprintf(n, z
d7c0: 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41  Stmt, "CREATE TA
d7d0: 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71  BLE ");.  k = sq
d7e0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53  lite3Strlen30(zS
d7f0: 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74  tmt);.  identPut
d800: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a  (zStmt, &k, p->z
d810: 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b  Name);.  zStmt[k
d820: 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72  ++] = '(';.  for
d830: 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69  (pCol=p->aCol, i
d840: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
d850: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
d860: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
d870: 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70  ar * const azTyp
d880: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
d890: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  /* SQLITE_AFF_BL
d8a0: 4f 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20  OB    */ "",.   
d8b0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
d8c0: 46 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20  FF_TEXT    */ " 
d8d0: 54 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f  TEXT",.        /
d8e0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  * SQLITE_AFF_NUM
d8f0: 45 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a  ERIC */ " NUM",.
d900: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
d910: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f  E_AFF_INTEGER */
d920: 20 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20   " INT",.       
d930: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52   /* SQLITE_AFF_R
d940: 45 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c  EAL    */ " REAL
d950: 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ".    };.    int
d960: 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20   len;.    const 
d970: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20  char *zType;..  
d980: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
d990: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
d9a0: 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20  ], zSep);.    k 
d9b0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
d9c0: 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20  30(&zStmt[k]);. 
d9d0: 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b     zSep = zSep2;
d9e0: 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53  .    identPut(zS
d9f0: 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a  tmt, &k, pCol->z
da00: 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Name);.    asser
da10: 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  t( pCol->affinit
da20: 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  y-SQLITE_AFF_BLO
da30: 42 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73  B >= 0 );.    as
da40: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69  sert( pCol->affi
da50: 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f  nity-SQLITE_AFF_
da60: 42 4c 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65  BLOB < ArraySize
da70: 28 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20  (azType) );.    
da80: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
da90: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
daa0: 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20  _AFF_BLOB );.   
dab0: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
dac0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
dad0: 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20  E_AFF_TEXT );.  
dae0: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
daf0: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
db00: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
db10: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
db20: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
db30: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
db40: 45 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ER );.    testca
db50: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
db60: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
db70: 45 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20  EAL );.    .    
db80: 7a 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70  zType = azType[p
db90: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20  Col->affinity - 
dba0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d  SQLITE_AFF_BLOB]
dbb0: 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69  ;.    len = sqli
dbc0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70  te3Strlen30(zTyp
dbd0: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
dbe0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
dbf0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
dc00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
dc10: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
dc20: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
dc30: 79 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b  ype(zType, 0) );
dc40: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74  .    memcpy(&zSt
dc50: 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65  mt[k], zType, le
dc60: 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e  n);.    k += len
dc70: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c  ;.    assert( k<
dc80: 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  =n );.  }.  sqli
dc90: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b  te3_snprintf(n-k
dca0: 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73  , &zStmt[k], "%s
dcb0: 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75  ", zEnd);.  retu
dcc0: 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a  rn zStmt;.}../*.
dcd0: 2a 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64  ** Resize an Ind
dce0: 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c  ex object to hol
dcf0: 64 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61  d N columns tota
dd00: 6c 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  l.  Return SQLIT
dd10: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
dd20: 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f  ss and SQLITE_NO
dd30: 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72  MEM on an OOM er
dd40: 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
dd50: 6e 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62  nt resizeIndexOb
dd60: 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  ject(sqlite3 *db
dd70: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  , Index *pIdx, i
dd80: 6e 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a  nt N){.  char *z
dd90: 45 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79  Extra;.  int nBy
dda0: 74 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e  te;.  if( pIdx->
ddb0: 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74  nColumn>=N ) ret
ddc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
ddd0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69   assert( pIdx->i
dde0: 73 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20  sResized==0 );. 
ddf0: 20 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66   nByte = (sizeof
de00: 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66  (char*) + sizeof
de10: 28 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20  (i16) + 1)*N;.  
de20: 7a 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33  zExtra = sqlite3
de30: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
de40: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a   nByte);.  if( z
de50: 45 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72  Extra==0 ) retur
de60: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
de70: 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  KPT;.  memcpy(zE
de80: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  xtra, pIdx->azCo
de90: 6c 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a  ll, sizeof(char*
dea0: 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  )*pIdx->nColumn)
deb0: 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ;.  pIdx->azColl
dec0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a   = (const char**
ded0: 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72  )zExtra;.  zExtr
dee0: 61 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72  a += sizeof(char
def0: 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a  *)*N;.  memcpy(z
df00: 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43  Extra, pIdx->aiC
df10: 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31  olumn, sizeof(i1
df20: 36 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  6)*pIdx->nColumn
df30: 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c  );.  pIdx->aiCol
df40: 75 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74  umn = (i16*)zExt
df50: 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20  ra;.  zExtra += 
df60: 73 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20  sizeof(i16)*N;. 
df70: 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
df80: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
df90: 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  , pIdx->nColumn)
dfa0: 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ;.  pIdx->aSortO
dfb0: 72 64 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74  rder = (u8*)zExt
dfc0: 72 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c  ra;.  pIdx->nCol
dfd0: 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d  umn = N;.  pIdx-
dfe0: 3e 69 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a  >isResized = 1;.
dff0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e000: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  OK;.}../*.** Est
e010: 69 6d 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20  imate the total 
e020: 72 6f 77 20 77 69 64 74 68 20 66 6f 72 20 61 20  row width for a 
e030: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
e040: 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61   void estimateTa
e050: 62 6c 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a  bleWidth(Table *
e060: 70 54 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pTab){.  unsigne
e070: 64 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  d wTable = 0;.  
e080: 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54  const Column *pT
e090: 61 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  abCol;.  int i;.
e0a0: 20 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43    for(i=pTab->nC
e0b0: 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62  ol, pTabCol=pTab
e0c0: 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d  ->aCol; i>0; i--
e0d0: 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20  , pTabCol++){.  
e0e0: 20 20 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62    wTable += pTab
e0f0: 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a  Col->szEst;.  }.
e100: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
e110: 79 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a  y<0 ) wTable++;.
e120: 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77    pTab->szTabRow
e130: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
e140: 28 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f  (wTable*4);.}../
e150: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
e160: 65 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f  e average size o
e170: 66 20 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69  f a row for an i
e180: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
e190: 76 6f 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64  void estimateInd
e1a0: 65 78 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70  exWidth(Index *p
e1b0: 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Idx){.  unsigned
e1c0: 20 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69   wIndex = 0;.  i
e1d0: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f  nt i;.  const Co
e1e0: 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64  lumn *aCol = pId
e1f0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b  x->pTable->aCol;
e200: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
e210: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
e220: 29 7b 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70  ){.    i16 x = p
e230: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
e240: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 3c  ;.    assert( x<
e250: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43  pIdx->pTable->nC
e260: 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78  ol );.    wIndex
e270: 20 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43   += x<0 ? 1 : aC
e280: 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ol[pIdx->aiColum
e290: 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d  n[i]].szEst;.  }
e2a0: 0a 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  .  pIdx->szIdxRo
e2b0: 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
e2c0: 74 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a  t(wIndex*4);.}..
e2d0: 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  /* Return true i
e2e0: 66 20 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75  f value x is fou
e2f0: 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69  nd any of the fi
e300: 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73  rst nCol entries
e310: 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73   of aiCol[].*/.s
e320: 74 61 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c  tatic int hasCol
e330: 75 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61  umn(const i16 *a
e340: 69 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20  iCol, int nCol, 
e350: 69 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28  int x){.  while(
e360: 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66   nCol-- > 0 ) if
e370: 28 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20  ( x==*(aiCol++) 
e380: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
e390: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  turn 0;.}../* Re
e3a0: 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 4e  compute the colN
e3b0: 6f 74 49 64 78 65 64 20 66 69 65 6c 64 20 6f 66  otIdxed field of
e3c0: 20 74 68 65 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a   the Index..**.*
e3d0: 2a 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73  * colNotIdxed is
e3e0: 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20   a bitmask that 
e3f0: 68 61 73 20 61 20 30 20 62 69 74 20 72 65 70 72  has a 0 bit repr
e400: 65 73 65 6e 74 69 6e 67 20 65 61 63 68 20 69 6e  esenting each in
e410: 64 65 78 65 64 0a 2a 2a 20 63 6f 6c 75 6d 6e 73  dexed.** columns
e420: 20 74 68 61 74 20 61 72 65 20 77 69 74 68 69 6e   that are within
e430: 20 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f   the first 63 co
e440: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
e450: 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 68 69 67 68  le.  The.** high
e460: 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20 63 6f  -order bit of co
e470: 6c 4e 6f 74 49 64 78 65 64 20 69 73 20 61 6c 77  lNotIdxed is alw
e480: 61 79 73 20 31 2e 20 20 41 6c 6c 20 75 6e 69 6e  ays 1.  All unin
e490: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  dexed columns.**
e4a0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   of the table ha
e4b0: 76 65 20 61 20 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  ve a 1..**.** Th
e4c0: 65 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 6d 61  e colNotIdxed ma
e4d0: 73 6b 20 69 73 20 41 4e 44 2d 65 64 20 77 69 74  sk is AND-ed wit
e4e0: 68 20 74 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  h the SrcList.a[
e4f0: 5d 2e 63 6f 6c 55 73 65 64 20 6d 61 73 6b 0a 2a  ].colUsed mask.*
e500: 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  * to determine i
e510: 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 63  f the index is c
e520: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  overing index..*
e530: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
e540: 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f  computeColumnsNo
e550: 74 49 6e 64 65 78 65 64 28 49 6e 64 65 78 20 2a  tIndexed(Index *
e560: 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b  pIdx){.  Bitmask
e570: 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b   m = 0;.  int j;
e580: 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e  .  for(j=pIdx->n
e590: 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20  Column-1; j>=0; 
e5a0: 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  j--){.    int x 
e5b0: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
e5c0: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d  [j];.    if( x>=
e5d0: 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
e5e0: 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b  ase( x==BMS-1 );
e5f0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e600: 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20   x==BMS-2 );.   
e610: 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
e620: 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29   m |= MASKBIT(x)
e630: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  ;.    }.  }.  pI
e640: 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 20  dx->colNotIdxed 
e650: 3d 20 7e 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  = ~m;.  assert( 
e660: 28 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78  (pIdx->colNotIdx
e670: 65 64 3e 3e 36 33 29 3d 3d 31 20 29 3b 0a 7d 0a  ed>>63)==1 );.}.
e680: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
e690: 69 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65 20  ine runs at the 
e6a0: 65 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61  end of parsing a
e6b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
e6c0: 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20  atement that.** 
e6d0: 68 61 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f  has a WITHOUT RO
e6e0: 57 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65  WID clause.  The
e6f0: 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
e700: 74 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65  tine is to conve
e710: 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72  rt both.** inter
e720: 6e 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20  nal schema data 
e730: 73 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 74  structures and t
e740: 68 65 20 67 65 6e 65 72 61 74 65 64 20 56 44 42  he generated VDB
e750: 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74  E code so that t
e760: 68 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f  hey.** are appro
e770: 70 72 69 61 74 65 20 66 6f 72 20 61 20 57 49 54  priate for a WIT
e780: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
e790: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f   instead of a ro
e7a0: 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68  wid table..** Ch
e7b0: 61 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a  anges include:.*
e7c0: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 53 65  *.**     (1)  Se
e7d0: 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  t all columns of
e7e0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e7f0: 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 74   schema object t
e800: 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a  o be NOT NULL..*
e810: 2a 20 20 20 20 20 28 32 29 20 20 43 6f 6e 76 65  *     (2)  Conve
e820: 72 74 20 50 33 20 70 61 72 61 6d 65 74 65 72 20  rt P3 parameter 
e830: 6f 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65  of the OP_Create
e840: 42 74 72 65 65 20 66 72 6f 6d 20 42 54 52 45 45  Btree from BTREE
e850: 5f 49 4e 54 4b 45 59 20 0a 2a 2a 20 20 20 20 20  _INTKEY .**     
e860: 20 20 20 20 20 69 6e 74 6f 20 42 54 52 45 45 5f       into BTREE_
e870: 42 4c 4f 42 4b 45 59 2e 0a 2a 2a 20 20 20 20 20  BLOBKEY..**     
e880: 28 33 29 20 20 42 79 70 61 73 73 20 74 68 65 20  (3)  Bypass the 
e890: 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  creation of the 
e8a0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
e8b0: 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20  ble entry.**    
e8c0: 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 50 52        for the PR
e8d0: 49 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68 65  IMARY KEY as the
e8e0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
e8f0: 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20  ex is now.**    
e900: 20 20 20 20 20 20 69 64 65 6e 74 69 66 69 65 64        identified
e910: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   by the sqlite_m
e920: 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72  aster table entr
e930: 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  y of the table i
e940: 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 34  tself..**     (4
e950: 29 20 20 53 65 74 20 74 68 65 20 49 6e 64 65 78  )  Set the Index
e960: 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49  .tnum of the PRI
e970: 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f  MARY KEY Index o
e980: 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20  bject in the.** 
e990: 20 20 20 20 20 20 20 20 20 73 63 68 65 6d 61 20           schema 
e9a0: 74 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  to the rootpage 
e9b0: 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61  from the main ta
e9c0: 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 35 29 20  ble..**     (5) 
e9d0: 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63   Add all table c
e9e0: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52  olumns to the PR
e9f0: 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20  IMARY KEY Index 
ea00: 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20 20  object.**       
ea10: 20 20 20 73 6f 20 74 68 61 74 20 74 68 65 20 50     so that the P
ea20: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 61 20  RIMARY KEY is a 
ea30: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20  covering index. 
ea40: 20 54 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a 20   The surplus.** 
ea50: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73           columns
ea60: 20 61 72 65 20 70 61 72 74 20 6f 66 20 4b 65 79   are part of Key
ea70: 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 61  Info.nAllField a
ea80: 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  nd are not used 
ea90: 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  for.**          
eaa0: 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75  sorting or looku
eab0: 70 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73 20  p or uniqueness 
eac0: 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20 28  checks..**     (
ead0: 36 29 20 20 52 65 70 6c 61 63 65 20 74 68 65 20  6)  Replace the 
eae0: 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61 6c  rowid tail on al
eaf0: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
eb00: 67 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55 45  generated UNIQUE
eb10: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e 64  .**          ind
eb20: 69 63 65 73 20 77 69 74 68 20 74 68 65 20 50 52  ices with the PR
eb30: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
eb40: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 76 69 72  s..**.** For vir
eb50: 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 6f 6e 6c  tual tables, onl
eb60: 79 20 28 31 29 20 69 73 20 70 65 72 66 6f 72 6d  y (1) is perform
eb70: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
eb80: 69 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68  id convertToWith
eb90: 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50 61  outRowidTable(Pa
eba0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
ebb0: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
ebc0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64 65  ex *pIdx;.  Inde
ebd0: 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e 50  x *pPk;.  int nP
ebe0: 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  k;.  int i, j;. 
ebf0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
ec00: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
ec10: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
ec20: 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  Vdbe;..  /* Mark
ec30: 20 65 76 65 72 79 20 50 52 49 4d 41 52 59 20 4b   every PRIMARY K
ec40: 45 59 20 63 6f 6c 75 6d 6e 20 61 73 20 4e 4f 54  EY column as NOT
ec50: 20 4e 55 4c 4c 20 28 65 78 63 65 70 74 20 66 6f   NULL (except fo
ec60: 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  r imposter table
ec70: 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  s).  */.  if( !d
ec80: 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72  b->init.imposter
ec90: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 6f 72  Table ){.    for
eca0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
ecb0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
ecc0: 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  if( (pTab->aCol[
ecd0: 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  i].colFlags & CO
ece0: 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d  LFLAG_PRIMKEY)!=
ecf0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61  0 ){.        pTa
ed00: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75  b->aCol[i].notNu
ed10: 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  ll = OE_Abort;. 
ed20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ed30: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
ed40: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 6f 66  he P3 operand of
ed50: 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 42 74   the OP_CreateBt
ed60: 72 65 65 20 6f 70 63 6f 64 65 20 66 72 6f 6d 20  ree opcode from 
ed70: 42 54 52 45 45 5f 49 4e 54 4b 45 59 0a 20 20 2a  BTREE_INTKEY.  *
ed80: 2a 20 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f  * into BTREE_BLO
ed90: 42 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BKEY..  */.  if(
eda0: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
edb0: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
edc0: 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ( v );.    sqlit
edd0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
ede0: 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72  , pParse->addrCr
edf0: 54 61 62 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b  Tab, BTREE_BLOBK
ee00: 45 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  EY);.  }..  /* L
ee10: 6f 63 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  ocate the PRIMAR
ee20: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72  Y KEY index.  Or
ee30: 2c 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  , if this table 
ee40: 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  was originally. 
ee50: 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50   ** an INTEGER P
ee60: 52 49 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65  RIMARY KEY table
ee70: 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 50  , create a new P
ee80: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
ee90: 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  . .  */.  if( pT
eea0: 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a  ab->iPKey>=0 ){.
eeb0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
eec0: 69 73 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69  ist;.    Token i
eed0: 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71 6c  pkToken;.    sql
eee0: 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 69  ite3TokenInit(&i
eef0: 70 6b 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e 61  pkToken, pTab->a
ef00: 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d  Col[pTab->iPKey]
ef10: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69  .zName);.    pLi
ef20: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
ef30: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
ef40: 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  e, 0, .         
ef50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ef60: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
ef70: 5f 49 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20  _ID, &ipkToken, 
ef80: 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  0));.    if( pLi
ef90: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
efa0: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e      pList->a[0].
efb0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72  sortOrder = pPar
efc0: 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72  se->iPkSortOrder
efd0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
efe0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
eff0: 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 73 71 6c  =pTab );.    sql
f000: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
f010: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
f020: 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65   pList, pTab->ke
f030: 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20  yConf, 0, 0, 0, 
f040: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
f050: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
f060: 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
f070: 4b 45 59 29 3b 0a 20 20 20 20 69 66 28 20 64 62  KEY);.    if( db
f080: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
f090: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
f0a0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b   return;.    pPk
f0b0: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
f0c0: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
f0d0: 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
f0e0: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
f0f0: 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65      pPk = sqlite
f100: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
f110: 28 70 54 61 62 29 3b 0a 20 20 20 20 61 73 73 65  (pTab);.    asse
f120: 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 0a 20  rt( pPk!=0 );.. 
f130: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 6d     /*.    ** Rem
f140: 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e 64 61 6e  ove all redundan
f150: 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  t columns from t
f160: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20  he PRIMARY KEY. 
f170: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 68   For example, ch
f180: 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50 52 49  ange.    ** "PRI
f190: 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 61 2c 62  MARY KEY(a,b,a,b
f1a0: 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74 6f 20  ,c,b,c,d)" into 
f1b0: 6a 75 73 74 20 22 50 52 49 4d 41 52 59 20 4b 45  just "PRIMARY KE
f1c0: 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20 4c 61  Y(a,b,c,d)".  La
f1d0: 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  ter.    ** code 
f1e0: 61 73 73 75 6d 65 73 20 74 68 65 20 50 52 49 4d  assumes the PRIM
f1f0: 41 52 59 20 4b 45 59 20 63 6f 6e 74 61 69 6e 73  ARY KEY contains
f200: 20 6e 6f 20 72 65 70 65 61 74 65 64 20 63 6f 6c   no repeated col
f210: 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  umns..    */.   
f220: 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c 70 50   for(i=j=1; i<pP
f230: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29  k->nKeyCol; i++)
f240: 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 43  {.      if( hasC
f250: 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c  olumn(pPk->aiCol
f260: 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69 43  umn, j, pPk->aiC
f270: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20  olumn[i]) ){.   
f280: 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d       pPk->nColum
f290: 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n--;.      }else
f2a0: 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61  {.        pPk->a
f2b0: 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70  iColumn[j++] = p
f2c0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  Pk->aiColumn[i];
f2d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f2e0: 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20     pPk->nKeyCol 
f2f0: 3d 20 6a 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = j;.  }.  asser
f300: 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20 70  t( pPk!=0 );.  p
f310: 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d  Pk->isCovering =
f320: 20 31 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   1;.  if( !db->i
f330: 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c  nit.imposterTabl
f340: 65 20 29 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74  e ) pPk->uniqNot
f350: 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e 50 6b 20  Null = 1;.  nPk 
f360: 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a  = pPk->nKeyCol;.
f370: 0a 20 20 2f 2a 20 42 79 70 61 73 73 20 74 68 65  .  /* Bypass the
f380: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
f390: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 62 74 72   PRIMARY KEY btr
f3a0: 65 65 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  ee and the sqlit
f3b0: 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61  e_master.  ** ta
f3c0: 62 6c 65 20 65 6e 74 72 79 2e 20 54 68 69 73 20  ble entry. This 
f3d0: 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64  is only required
f3e0: 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 67 65   if currently ge
f3f0: 6e 65 72 61 74 69 6e 67 20 56 44 42 45 0a 20 20  nerating VDBE.  
f400: 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61 20 43 52  ** code for a CR
f410: 45 41 54 45 20 54 41 42 4c 45 20 28 6e 6f 74 20  EATE TABLE (not 
f420: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 6f 6e 65  when parsing one
f430: 20 61 73 20 70 61 72 74 20 6f 66 20 72 65 61 64   as part of read
f440: 69 6e 67 0a 20 20 2a 2a 20 61 20 64 61 74 61 62  ing.  ** a datab
f450: 61 73 65 20 73 63 68 65 6d 61 29 2e 20 20 2a 2f  ase schema).  */
f460: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 6b 2d  .  if( v && pPk-
f470: 3e 74 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 61  >tnum>0 ){.    a
f480: 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
f490: 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 73  busy==0 );.    s
f4a0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
f4b0: 4f 70 63 6f 64 65 28 76 2c 20 70 50 6b 2d 3e 74  Opcode(v, pPk->t
f4c0: 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  num, OP_Goto);. 
f4d0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f   }..  /* The roo
f4e0: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 50 52  t page of the PR
f4f0: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 74 68 65  IMARY KEY is the
f500: 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65   table root page
f510: 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20   */.  pPk->tnum 
f520: 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20  = pTab->tnum;.. 
f530: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 69   /* Update the i
f540: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
f550: 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55  ntation of all U
f560: 4e 49 51 55 45 20 69 6e 64 69 63 65 73 20 62 79  NIQUE indices by
f570: 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a   converting.  **
f580: 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
f590: 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65   column into one
f5a0: 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73   or more columns
f5b0: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
f5c0: 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  KEY..  */.  for(
f5d0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
f5e0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
f5f0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
f600: 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 49  int n;.    if( I
f610: 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
f620: 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75  (pIdx) ) continu
f630: 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30  e;.    for(i=n=0
f640: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
f650: 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c       if( !hasCol
f660: 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  umn(pIdx->aiColu
f670: 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  mn, pIdx->nKeyCo
f680: 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  l, pPk->aiColumn
f690: 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  [i]) ) n++;.    
f6a0: 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  }.    if( n==0 )
f6b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
f6c0: 69 6e 64 65 78 20 69 73 20 61 20 73 75 70 65 72  index is a super
f6d0: 73 65 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61  set of the prima
f6e0: 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20  ry key */.      
f6f0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  pIdx->nColumn = 
f700: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20  pIdx->nKeyCol;. 
f710: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
f720: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73     }.    if( res
f730: 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64  izeIndexObject(d
f740: 62 2c 20 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e  b, pIdx, pIdx->n
f750: 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75  KeyCol+n) ) retu
f760: 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  rn;.    for(i=0,
f770: 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j=pIdx->nKeyCol
f780: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
f790: 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c       if( !hasCol
f7a0: 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  umn(pIdx->aiColu
f7b0: 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  mn, pIdx->nKeyCo
f7c0: 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  l, pPk->aiColumn
f7d0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
f7e0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
f7f0: 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ] = pPk->aiColum
f800: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 49  n[i];.        pI
f810: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20  dx->azColl[j] = 
f820: 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  pPk->azColl[i];.
f830: 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
f840: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
f850: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
f860: 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79  lumn>=pIdx->nKey
f870: 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73  Col+n );.    ass
f880: 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
f890: 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20  mn>=j );.  }..  
f8a0: 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65  /* Add all table
f8b0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
f8c0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
f8d0: 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 6b  x.  */.  if( nPk
f8e0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
f8f0: 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64     if( resizeInd
f900: 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50 6b  exObject(db, pPk
f910: 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 20  , pTab->nCol) ) 
f920: 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28  return;.    for(
f930: 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54  i=0, j=nPk; i<pT
f940: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
f950: 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f        if( !hasCo
f960: 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75  lumn(pPk->aiColu
f970: 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20 20  mn, j, i) ){.   
f980: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
f990: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  Pk->nColumn );. 
f9a0: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f         pPk->aiCo
f9b0: 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20  lumn[j] = i;.   
f9c0: 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c       pPk->azColl
f9d0: 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72  [j] = sqlite3Str
f9e0: 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20 20  BINARY;.        
f9f0: 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j++;.      }.   
fa00: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
fa10: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29  Pk->nColumn==j )
fa20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
fa30: 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20  ab->nCol==j );. 
fa40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d   }else{.    pPk-
fa50: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d  >nColumn = pTab-
fa60: 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 63  >nCol;.  }.  rec
fa70: 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74  omputeColumnsNot
fa80: 49 6e 64 65 78 65 64 28 70 50 6b 29 3b 0a 7d 0a  Indexed(pPk);.}.
fa90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
faa0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
fab0: 45 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  E./*.** Return t
fac0: 72 75 65 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  rue if zName is 
fad0: 61 20 73 68 61 64 6f 77 20 74 61 62 6c 65 20 6e  a shadow table n
fae0: 61 6d 65 20 69 6e 20 74 68 65 20 63 75 72 72 65  ame in the curre
faf0: 6e 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  nt database.** c
fb00: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
fb10: 20 7a 4e 61 6d 65 20 69 73 20 74 65 6d 70 6f 72   zName is tempor
fb20: 61 72 69 6c 79 20 6d 6f 64 69 66 69 65 64 20 77  arily modified w
fb30: 68 69 6c 65 20 74 68 69 73 20 72 6f 75 74 69 6e  hile this routin
fb40: 65 20 69 73 20 72 75 6e 6e 69 6e 67 2c 20 62 75  e is running, bu
fb50: 74 20 69 73 0a 2a 2a 20 72 65 73 74 6f 72 65 64  t is.** restored
fb60: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
fb70: 20 76 61 6c 75 65 20 70 72 69 6f 72 20 74 6f 20   value prior to 
fb80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
fb90: 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
fba0: 63 20 69 6e 74 20 69 73 53 68 61 64 6f 77 54 61  c int isShadowTa
fbb0: 62 6c 65 4e 61 6d 65 28 73 71 6c 69 74 65 33 20  bleName(sqlite3 
fbc0: 2a 64 62 2c 20 63 68 61 72 20 2a 7a 4e 61 6d 65  *db, char *zName
fbd0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 61 69 6c  ){.  char *zTail
fbe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fbf0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
fc00: 20 74 68 65 20 6c 61 73 74 20 22 5f 22 20 69 6e   the last "_" in
fc10: 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c   zName */.  Tabl
fc20: 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
fc30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
fc40: 6c 65 20 74 68 61 74 20 7a 4e 61 6d 65 20 69 73  le that zName is
fc50: 20 61 20 73 68 61 64 6f 77 20 6f 66 20 2a 2f 0a   a shadow of */.
fc60: 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 3b 20    Module *pMod; 
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 2f 2a 20 4d 6f 64 75 6c 65 20 66 6f 72 20 74 68  /* Module for th
fc90: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
fca0: 2a 2f 0a 0a 20 20 7a 54 61 69 6c 20 3d 20 73 74  */..  zTail = st
fcb0: 72 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 5f 27  rrchr(zName, '_'
fcc0: 29 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 3d 3d  );.  if( zTail==
fcd0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
fce0: 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 70 54  *zTail = 0;.  pT
fcf0: 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
fd00: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
fd10: 20 30 29 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d 20   0);.  *zTail = 
fd20: 27 5f 27 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  '_';.  if( pTab=
fd30: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
fd40: 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28   if( !IsVirtual(
fd50: 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
fd60: 3b 0a 20 20 70 4d 6f 64 20 3d 20 28 4d 6f 64 75  ;.  pMod = (Modu
fd70: 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46  le*)sqlite3HashF
fd80: 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  ind(&db->aModule
fd90: 2c 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65  , pTab->azModule
fda0: 41 72 67 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70  Arg[0]);.  if( p
fdb0: 4d 6f 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Mod==0 ) return 
fdc0: 30 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70  0;.  if( pMod->p
fdd0: 4d 6f 64 75 6c 65 2d 3e 69 56 65 72 73 69 6f 6e  Module->iVersion
fde0: 3c 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <3 ) return 0;. 
fdf0: 20 69 66 28 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75   if( pMod->pModu
fe00: 6c 65 2d 3e 78 53 68 61 64 6f 77 4e 61 6d 65 3d  le->xShadowName=
fe10: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
fe20: 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e 70 4d   return pMod->pM
fe30: 6f 64 75 6c 65 2d 3e 78 53 68 61 64 6f 77 4e 61  odule->xShadowNa
fe40: 6d 65 28 7a 54 61 69 6c 2b 31 29 3b 0a 7d 0a 23  me(zTail+1);.}.#
fe50: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 69 73  else.# define is
fe60: 53 68 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65 28  ShadowTableName(
fe70: 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 20 2f 2a  x,y) 0.#endif /*
fe80: 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
fe90: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
fea0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
feb0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
fec0: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20  d to report the 
fed0: 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74  final ")" that t
fee0: 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43  erminates.** a C
fef0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
ff00: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
ff10: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
ff20: 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69   that other acti
ff30: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  on routines have
ff40: 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a   been building.*
ff50: 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
ff60: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
ff70: 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67  tables, assuming
ff80: 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a   no errors have.
ff90: 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a  ** occurred..**.
ffa0: 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20  ** An entry for 
ffb0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64  the table is mad
ffc0: 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  e in the master 
ffd0: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75  table on disk, u
ffe0: 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73  nless.** this is
fff0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
10000 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62  le or db->init.b
10010 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62  usy==1.  When db
10020 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a  ->init.busy==1.*
10030 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
10040 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
10050 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
10060 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
10070 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
10080 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
10090 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
100a0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
100b0 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
100c0 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68  y changed, so th
100d0 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
100e0 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
100f0 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
10100 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
10110 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
10120 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
10130 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
10140 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
10150 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
10160 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
10170 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
10180 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
10190 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
101a0 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
101b0 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
101c0 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
101d0 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
101e0 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
101f0 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
10200 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
10210 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
10220 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
10230 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
10240 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  dTable(.  Parse 
10250 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
10260 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
10270 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
10280 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20  Cons,           
10290 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e  /* The ',' token
102a0 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
102b0 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a  column defn. */.
102c0 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
102d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
102e0 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70 74 69   ')' before opti
102f0 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45 41 54  ons in the CREAT
10300 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38 20  E TABLE */.  u8 
10310 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20 20 20  tabOpts,        
10320 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 74 61       /* Extra ta
10330 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73 75  ble options. Usu
10340 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65 6c  ally 0. */.  Sel
10350 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
10360 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66       /* Select f
10370 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e  rom a "CREATE ..
10380 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a  . AS SELECT" */.
10390 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20 20  ){.  Table *p;  
103a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
103b0 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
103c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
103d0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f   = pParse->db; /
103e0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
103f0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
10400 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
10410 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
10420 62 61 73 65 20 69 6e 20 77 68 69 63 68 20 74 68  base in which th
10430 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20 2a 2f  e table lives */
10440 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10460 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78  An implied index
10470 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
10480 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30 20  ..  if( pEnd==0 
10490 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  && pSelect==0 ){
104a0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
104b0 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
104c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
104d0 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
104e0 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
104f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
10500 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20   if( pSelect==0 
10510 26 26 20 69 73 53 68 61 64 6f 77 54 61 62 6c 65  && isShadowTable
10520 4e 61 6d 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d  Name(db, p->zNam
10530 65 29 20 29 7b 0a 20 20 20 20 70 2d 3e 74 61 62  e) ){.    p->tab
10540 46 6c 61 67 73 20 7c 3d 20 54 46 5f 53 68 61 64  Flags |= TF_Shad
10550 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ow;.  }..  /* If
10560 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
10570 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  sy is 1 it means
10580 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
10590 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
105a0 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
105b0 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f  ter" or "sqlite_
105c0 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62  temp_master" tab
105d0 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a  le on the disk..
105e0 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77    ** So do not w
105f0 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
10600 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
10610 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
10620 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
10630 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
10640 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  e db->init.newTn
10650 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
10660 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
10670 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
10680 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74  n put there by t
10690 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
106a0 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a 20  routine.).  **. 
106b0 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20   ** If the root 
106c0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 31  page number is 1
106d0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 69  , that means thi
106e0 73 20 69 73 20 74 68 65 20 73 71 6c 69 74 65 5f  s is the sqlite_
106f0 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c  master.  ** tabl
10700 65 20 69 74 73 65 6c 66 2e 20 20 53 6f 20 6d 61  e itself.  So ma
10710 72 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e  rk it read-only.
10720 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
10730 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
10740 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
10750 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
10760 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 22  orMsg(pParse, ""
10770 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
10780 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e  .    }.    p->tn
10790 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
107a0 77 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20 70  wTnum;.    if( p
107b0 2d 3e 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74  ->tnum==1 ) p->t
107c0 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65  abFlags |= TF_Re
107d0 61 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 61  adonly;.  }..  a
107e0 73 73 65 72 74 28 20 28 70 2d 3e 74 61 62 46 6c  ssert( (p->tabFl
107f0 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d  ags & TF_HasPrim
10800 61 72 79 4b 65 79 29 3d 3d 30 0a 20 20 20 20 20  aryKey)==0.     
10810 20 20 7c 7c 20 70 2d 3e 69 50 4b 65 79 3e 3d 30    || p->iPKey>=0
10820 20 7c 7c 20 73 71 6c 69 74 65 33 50 72 69 6d 61   || sqlite3Prima
10830 72 79 4b 65 79 49 6e 64 65 78 28 70 29 21 3d 30  ryKeyIndex(p)!=0
10840 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
10850 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
10860 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29 21 3d  HasPrimaryKey)!=
10870 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 2d 3e  0.       || (p->
10880 69 50 4b 65 79 3c 30 20 26 26 20 73 71 6c 69 74  iPKey<0 && sqlit
10890 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
108a0 78 28 70 29 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  x(p)==0) );..  /
108b0 2a 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73  * Special proces
108c0 73 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54  sing for WITHOUT
108d0 20 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f   ROWID Tables */
108e0 0a 20 20 69 66 28 20 74 61 62 4f 70 74 73 20 26  .  if( tabOpts &
108f0 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64   TF_WithoutRowid
10900 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
10910 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
10920 74 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a  toincrement) ){.
10930 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
10940 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
10950 20 20 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43          "AUTOINC
10960 52 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77  REMENT not allow
10970 65 64 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f  ed on WITHOUT RO
10980 57 49 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  WID tables");.  
10990 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
109a0 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61  }.    if( (p->ta
109b0 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50  bFlags & TF_HasP
109c0 72 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b  rimaryKey)==0 ){
109d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
109e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
109f0 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73  PRIMARY KEY miss
10a00 69 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22  ing on table %s"
10a10 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
10a20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
10a30 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
10a40 57 69 74 68 6f 75 74 52 6f 77 69 64 20 7c 20 54  WithoutRowid | T
10a50 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64  F_NoVisibleRowid
10a60 3b 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74 54  ;.      convertT
10a70 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62  oWithoutRowidTab
10a80 6c 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  le(pParse, p);. 
10a90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20     }.  }..  iDb 
10aa0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
10ab0 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53  oIndex(db, p->pS
10ac0 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
10ad0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
10ae0 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  CK.  /* Resolve 
10af0 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45  names in all CHE
10b00 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  CK constraint ex
10b10 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
10b20 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20    if( p->pCheck 
10b30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
10b40 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e  solveSelfReferen
10b50 63 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43  ce(pParse, p, NC
10b60 5f 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e  _IsCheck, 0, p->
10b70 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e  pCheck);.  }.#en
10b80 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
10b90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
10ba0 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69  K) */..  /* Esti
10bb0 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65  mate the average
10bc0 20 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74 68   row size for th
10bd0 65 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20  e table and for 
10be0 61 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64 69  all implied indi
10bf0 63 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74  ces */.  estimat
10c00 65 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b 0a  eTableWidth(p);.
10c10 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49    for(pIdx=p->pI
10c20 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
10c30 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
10c40 20 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78     estimateIndex
10c50 57 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20 7d  Width(pIdx);.  }
10c60 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
10c70 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
10c80 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
10c90 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
10ca0 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
10cb0 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
10cc0 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
10cd0 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  se..  **.  ** If
10ce0 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
10cf0 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
10d00 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
10d10 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
10d20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
10d30 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
10d40 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
10d50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
10d60 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
10d70 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
10d80 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
10d90 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69  zType;    /* "vi
10da0 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a  ew" or "table" *
10db0 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  /.    char *zTyp
10dc0 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20  e2;   /* "VIEW" 
10dd0 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20  or "TABLE" */.  
10de0 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20    char *zStmt;  
10df0 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
10e00 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72   CREATE TABLE or
10e10 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
10e20 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76  tement */..    v
10e30 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
10e40 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
10e50 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
10e60 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71   return;..    sq
10e70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
10e80 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b  v, OP_Close, 0);
10e90 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a  ..    /* .    **
10ea0 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70   Initialize zTyp
10eb0 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69  e for the new vi
10ec0 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20  ew or table..   
10ed0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
10ee0 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
10ef0 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20     /* A regular 
10f00 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a  table */.      z
10f10 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a  Type = "table";.
10f20 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
10f30 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20  TABLE";.#ifndef 
10f40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
10f50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10f60 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
10f70 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69       zType = "vi
10f80 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  ew";.      zType
10f90 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64  2 = "VIEW";.#end
10fa0 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
10fb0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52   If this is a CR
10fc0 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53  EATE TABLE xx AS
10fd0 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65   SELECT ..., exe
10fe0 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a  cute the SELECT.
10ff0 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
11000 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
11010 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20   new table. The 
11020 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
11030 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
11040 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20  new table is in 
11050 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d  register pParse-
11060 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a  >regRoot..    **
11070 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65  .    ** Once the
11080 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
11090 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65   coded by sqlite
110a0 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73  3Select(), it is
110b0 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69   in a.    ** sui
110c0 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71  table state to q
110d0 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  uery for the col
110e0 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79  umn names and ty
110f0 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20  pes to be used. 
11100 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77     ** by the new
11110 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20   table..    **. 
11120 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63     ** A shared-c
11130 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ache write-lock 
11140 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
11150 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
11160 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a  new table,.    *
11170 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f  * as a schema-lo
11180 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ck must have alr
11190 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e  eady been obtain
111a0 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e  ed to create it.
111b0 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20   Since.    ** a 
111c0 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c  schema-lock excl
111d0 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64  udes all other d
111e0 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74  atabase users, t
111f0 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f  he write-lock wo
11200 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  uld.    ** be re
11210 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a  dundant..    */.
11220 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
11230 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  ){.      SelectD
11240 65 73 74 20 64 65 73 74 3b 20 20 20 20 2f 2a 20  est dest;    /* 
11250 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54  Where the SELECT
11260 20 73 68 6f 75 6c 64 20 73 74 6f 72 65 20 72 65   should store re
11270 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  sults */.      i
11280 6e 74 20 72 65 67 59 69 65 6c 64 3b 20 20 20 20  nt regYield;    
11290 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
112a0 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e  olding co-routin
112b0 65 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f  e entry-point */
112c0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
112d0 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  op;        /* To
112e0 70 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74  p of the co-rout
112f0 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ine */.      int
11300 20 72 65 67 52 65 63 3b 20 20 20 20 20 20 20 20   regRec;        
11310 20 2f 2a 20 41 20 72 65 63 6f 72 64 20 74 6f 20   /* A record to 
11320 62 65 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74  be insert into t
11330 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a  he new table */.
11340 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77        int regRow
11350 69 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  id;       /* Row
11360 69 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72  id of the next r
11370 6f 77 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a  ow to insert */.
11380 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e        int addrIn
11390 73 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70  sLoop;    /* Top
113a0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
113b0 20 69 6e 73 65 72 74 69 6e 67 20 72 6f 77 73 20   inserting rows 
113c0 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
113d0 70 53 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20  pSelTab;     /* 
113e0 41 20 74 61 62 6c 65 20 74 68 61 74 20 64 65 73  A table that des
113f0 63 72 69 62 65 73 20 74 68 65 20 53 45 4c 45 43  cribes the SELEC
11400 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20  T results */..  
11410 20 20 20 20 72 65 67 59 69 65 6c 64 20 3d 20 2b      regYield = +
11420 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
11430 20 20 20 20 20 72 65 67 52 65 63 20 3d 20 2b 2b       regRec = ++
11440 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
11450 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b      regRowid = +
11460 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
11470 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 72       assert(pPar
11480 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20  se->nTab==1);.  
11490 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
114a0 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ort(pParse);.   
114b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
114c0 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp3(v, OP_OpenW
114d0 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d  rite, 1, pParse-
114e0 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a  >regRoot, iDb);.
114f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11500 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
11510 4c 41 47 5f 50 32 49 53 52 45 47 29 3b 0a 20 20  LAG_P2ISREG);.  
11520 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
11530 20 3d 20 32 3b 0a 20 20 20 20 20 20 61 64 64 72   = 2;.      addr
11540 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
11550 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
11560 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 1;.      sqlit
11570 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11580 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
11590 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61  , regYield, 0, a
115a0 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 69  ddrTop);.      i
115b0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
115c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
115d0 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
115e0 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
115f0 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
11600 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ct);.      if( p
11610 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75  SelTab==0 ) retu
11620 72 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rn;.      assert
11630 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
11640 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20        p->nCol = 
11650 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
11660 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70       p->aCol = p
11670 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
11680 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
11690 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  l = 0;.      pSe
116a0 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
116b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
116c0 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65  eteTable(db, pSe
116d0 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71 6c  lTab);.      sql
116e0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
116f0 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f  it(&dest, SRT_Co
11700 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
11710 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
11720 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
11730 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b  pSelect, &dest);
11740 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
11750 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
11760 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11770 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
11780 76 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20  v, regYield);.  
11790 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
117a0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
117b0 6f 70 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 61  op - 1);.      a
117c0 64 64 72 49 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c  ddrInsLoop = sql
117d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
117e0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73 74  , OP_Yield, dest
117f0 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  .iSDParm);.     
11800 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
11810 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11820 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
11830 4d 61 6b 65 52 65 63 6f 72 64 2c 20 64 65 73 74  MakeRecord, dest
11840 2e 69 53 64 73 74 2c 20 64 65 73 74 2e 6e 53 64  .iSdst, dest.nSd
11850 73 74 2c 20 72 65 67 52 65 63 29 3b 0a 20 20 20  st, regRec);.   
11860 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 41     sqlite3TableA
11870 66 66 69 6e 69 74 79 28 76 2c 20 70 2c 20 30 29  ffinity(v, p, 0)
11880 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11890 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
118a0 4e 65 77 52 6f 77 69 64 2c 20 31 2c 20 72 65 67  NewRowid, 1, reg
118b0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
118c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
118d0 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 31 2c  v, OP_Insert, 1,
118e0 20 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77 69   regRec, regRowi
118f0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
11900 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
11910 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  rInsLoop);.     
11920 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
11930 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73 4c  Here(v, addrInsL
11940 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oop);.      sqli
11950 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
11960 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20   OP_Close, 1);. 
11970 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d     }..    /* Com
11980 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74  pute the complet
11990 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
119a0 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  EATE statement *
119b0 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  /.    if( pSelec
119c0 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74  t ){.      zStmt
119d0 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74   = createTableSt
119e0 6d 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d  mt(db, p);.    }
119f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65  else{.      Toke
11a00 6e 20 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f 70  n *pEnd2 = tabOp
11a10 74 73 20 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c  ts ? &pParse->sL
11a20 61 73 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b  astToken : pEnd;
11a30 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29  .      n = (int)
11a40 28 70 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72  (pEnd2->z - pPar
11a50 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
11a60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e  );.      if( pEn
11a70 64 32 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20  d2->z[0]!=';' ) 
11a80 6e 20 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20  n += pEnd2->n;. 
11a90 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
11aa0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
11ab0 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
11ac0 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79  TE %s %.*s", zTy
11ad0 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e  pe2, n, pParse->
11ae0 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20  sNameToken.z.   
11af0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
11b00 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74   /* A slot for t
11b10 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c  he record has al
11b20 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
11b30 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20  ated in the .   
11b40 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45   ** SQLITE_MASTE
11b50 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73  R table.  We jus
11b60 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65  t need to update
11b70 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20   that slot with 
11b80 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69  all.    ** the i
11b90 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65  nformation we've
11ba0 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20   collected..    
11bb0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
11bc0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
11bd0 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20  ,.      "UPDATE 
11be0 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20  %Q.%s ".        
11bf0 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c   "SET type='%s',
11c00 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61   name=%Q, tbl_na
11c10 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d  me=%Q, rootpage=
11c20 23 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20  #%d, sql=%Q ".  
11c30 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69       "WHERE rowi
11c40 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62  d=#%d",.      db
11c50 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
11c60 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45  ame, MASTER_NAME
11c70 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20  ,.      zType,. 
11c80 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
11c90 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
11ca0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67       pParse->reg
11cb0 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d  Root,.      zStm
11cc0 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  t,.      pParse-
11cd0 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b  >regRowid.    );
11ce0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
11cf0 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20  ee(db, zStmt);. 
11d00 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
11d10 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
11d20 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
11d30 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
11d40 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43  CREMENT.    /* C
11d50 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
11d60 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  e need to create
11d70 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65   an sqlite_seque
11d80 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20  nce table for.  
11d90 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61    ** keeping tra
11da0 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d  ck of autoincrem
11db0 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f  ent keys..    */
11dc0 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62  .    if( (p->tab
11dd0 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
11de0 6e 63 72 65 6d 65 6e 74 29 21 3d 30 20 29 7b 0a  ncrement)!=0 ){.
11df0 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20        Db *pDb = 
11e00 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
11e10 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
11e20 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
11e30 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
11e40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  );.      if( pDb
11e50 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54  ->pSchema->pSeqT
11e60 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
11e70 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
11e80 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
11e90 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
11ea0 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65  BLE %Q.sqlite_se
11eb0 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29  quence(name,seq)
11ec0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  ",.          pDb
11ed0 2d 3e 7a 44 62 53 4e 61 6d 65 0a 20 20 20 20 20  ->zDbSName.     
11ee0 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
11ef0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
11f00 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79  /* Reparse every
11f10 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20  thing to update 
11f20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74  our internal dat
11f30 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  a structures */.
11f40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11f50 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28  ddParseSchemaOp(
11f60 70 50 61 72 73 65 2c 20 69 44 62 2c 0a 20 20 20  pParse, iDb,.   
11f70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
11f80 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f  Printf(db, "tbl_
11f90 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
11fa0 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20  pe!='trigger'", 
11fb0 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a  p->zName));.  }.
11fc0 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
11fd0 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
11fe0 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
11ff0 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
12000 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
12010 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
12020 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
12030 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  d;.    Schema *p
12040 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68  Schema = p->pSch
12050 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ema;.    assert(
12060 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
12070 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
12080 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20   0) );.    pOld 
12090 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
120a0 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  ert(&pSchema->tb
120b0 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
120c0 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c   p);.    if( pOl
120d0 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  d ){.      asser
120e0 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f  t( p==pOld );  /
120f0 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
12100 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65  ve failed inside
12110 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f   HashInsert() */
12120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
12130 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
12140 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
12150 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
12160 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  Table = 0;.    d
12170 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44  b->mDbFlags |= D
12180 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e  BFLAG_SchemaChan
12190 67 65 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge;..#ifndef SQL
121a0 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
121b0 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  BLE.    if( !p->
121c0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
121d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
121e0 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
121f0 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   *)pParse->sName
12200 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69  Token.z;.      i
12210 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20  nt nName;.      
12220 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74  assert( !pSelect
12230 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e   && pCons && pEn
12240 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
12250 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  Cons->z==0 ){.  
12260 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45        pCons = pE
12270 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
12280 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28    nName = (int)(
12290 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43  (const char *)pC
122a0 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b  ons->z - zName);
122b0 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c  .      p->addCol
122c0 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71  Offset = 13 + sq
122d0 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e  lite3Utf8CharLen
122e0 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a  (zName, nName);.
122f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
12300 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
12310 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
12320 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
12330 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
12340 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
12350 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
12360 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
12370 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
12380 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
12390 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
123a0 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
123b0 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
123c0 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
123d0 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
123e0 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
123f0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
12400 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
12410 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
12420 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
12430 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
12440 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me2,     /* The 
12450 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
12460 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
12470 20 76 69 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c   view */.  ExprL
12480 69 73 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a  ist *pCNames, /*
12490 20 4f 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f   Optional list o
124a0 66 20 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61  f view column na
124b0 6d 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  mes */.  Select 
124c0 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41  *pSelect,   /* A
124d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
124e0 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  t that will beco
124f0 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  me the new view 
12500 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
12510 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
12520 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20  for a TEMPORARY 
12530 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  view */.  int no
12540 45 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Err          /* 
12550 53 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d  Suppress error m
12560 65 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20  essages if VIEW 
12570 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
12580 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
12590 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
125a0 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  t char *z;.  Tok
125b0 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
125c0 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e  er sFix;.  Token
125d0 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *pName = 0;.  i
125e0 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65  nt iDb;.  sqlite
125f0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
12600 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
12610 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20  e->nVar>0 ){.   
12620 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12630 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65  (pParse, "parame
12640 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c  ters are not all
12650 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b  owed in views");
12660 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
12670 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a  _view_fail;.  }.
12680 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
12690 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
126a0 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65  e1, pName2, isTe
126b0 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29  mp, 1, 0, noErr)
126c0 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
126d0 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
126e0 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
126f0 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 63 72 65  >nErr ) goto cre
12700 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20  ate_view_fail;. 
12710 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
12720 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
12730 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
12740 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  me);.  iDb = sql
12750 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
12760 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
12770 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49  );.  sqlite3FixI
12780 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
12790 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20  e, iDb, "view", 
127a0 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71  pName);.  if( sq
127b0 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26  lite3FixSelect(&
127c0 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29  sFix, pSelect) )
127d0 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65   goto create_vie
127e0 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61  w_fail;..  /* Ma
127f0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
12800 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
12810 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
12820 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
12830 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
12840 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
12850 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
12860 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
12870 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
12880 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
12890 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
128a0 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
128b0 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
128c0 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
128d0 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
128e0 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
128f0 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
12900 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 4e 5f 52  .  */.  if( IN_R
12910 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
12920 20 20 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d      p->pSelect =
12930 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 70 53   pSelect;.    pS
12940 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  elect = 0;.  }el
12950 73 65 7b 0a 20 20 20 20 70 2d 3e 70 53 65 6c 65  se{.    p->pSele
12960 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
12970 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63  ctDup(db, pSelec
12980 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
12990 45 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 43 68  E);.  }.  p->pCh
129a0 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eck = sqlite3Exp
129b0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43 4e  rListDup(db, pCN
129c0 61 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52 45  ames, EXPRDUP_RE
129d0 44 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62 2d  DUCE);.  if( db-
129e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
129f0 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
12a00 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  _fail;..  /* Loc
12a10 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
12a20 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
12a30 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
12a40 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
12a50 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
12a60 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
12a70 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
12a80 61 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b 30  assert( sEnd.z[0
12a90 5d 21 3d 30 20 7c 7c 20 73 45 6e 64 2e 6e 3d 3d  ]!=0 || sEnd.n==
12aa0 30 20 29 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e  0 );.  if( sEnd.
12ab0 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
12ac0 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
12ad0 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
12ae0 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  = 0;.  n = (int)
12af0 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e  (sEnd.z - pBegin
12b00 2d 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ->z);.  assert( 
12b10 6e 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65  n>0 );.  z = pBe
12b20 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
12b30 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
12b40 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20  z[n-1]) ){ n--; 
12b50 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b  }.  sEnd.z = &z[
12b60 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d  n-1];.  sEnd.n =
12b70 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71   1;..  /* Use sq
12b80 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
12b90 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20  to add the view 
12ba0 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  to the SQLITE_MA
12bb0 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20  STER table */.  
12bc0 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
12bd0 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64  pParse, 0, &sEnd
12be0 2c 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65  , 0, 0);..create
12bf0 5f 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71  _view_fail:.  sq
12c00 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
12c10 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
12c20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
12c30 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71  OBJECT ){.    sq
12c40 6c 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72 6c  lite3RenameExprl
12c50 69 73 74 55 6e 6d 61 70 28 70 50 61 72 73 65 2c  istUnmap(pParse,
12c60 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 7d 0a 20   pCNames);.  }. 
12c70 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
12c80 44 65 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d  Delete(db, pCNam
12c90 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  es);.  return;.}
12ca0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12cb0 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
12cc0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
12cd0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
12ce0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
12cf0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12d00 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54  BLE)./*.** The T
12d10 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  able structure p
12d20 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20  Table is really 
12d30 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e  a VIEW.  Fill in
12d40 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a   the names of.**
12d50 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
12d60 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20  the view in the 
12d70 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65  pTable structure
12d80 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
12d90 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
12da0 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  s.  If an error 
12db0 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e  is seen leave an
12dc0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
12dd0 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
12de0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
12df0 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
12e00 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  mes(Parse *pPars
12e10 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  e, Table *pTable
12e20 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  ){.  Table *pSel
12e30 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65  Tab;   /* A fake
12e40 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63   table from whic
12e50 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73  h we get the res
12e60 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c  ult set */.  Sel
12e70 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f  ect *pSel;     /
12e80 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45  * Copy of the SE
12e90 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d  LECT that implem
12ea0 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f  ents the view */
12eb0 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
12ec0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12ed0 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
12ee0 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ered */.  int n;
12ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12f00 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73  emporarily holds
12f10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
12f20 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20  ursors assigned 
12f30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
12f40 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
12f50 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
12f60 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f  ection for mallo
12f70 63 20 65 72 72 6f 72 73 20 2a 2f 0a 23 69 66 6e  c errors */.#ifn
12f80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12f90 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
12fa0 6e 74 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69  nt rc;.#endif.#i
12fb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12fc0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
12fd0 20 20 73 71 6c 69 74 65 33 5f 78 61 75 74 68 20    sqlite3_xauth 
12fe0 78 41 75 74 68 3b 20 20 20 20 20 20 20 2f 2a 20  xAuth;       /* 
12ff0 53 61 76 65 64 20 78 41 75 74 68 20 70 6f 69 6e  Saved xAuth poin
13000 74 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ter */.#endif.. 
13010 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
13020 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
13030 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
13040 41 42 4c 45 0a 20 20 64 62 2d 3e 6e 53 63 68 65  ABLE.  db->nSche
13050 6d 61 4c 6f 63 6b 2b 2b 3b 0a 20 20 72 63 20 3d  maLock++;.  rc =
13060 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
13070 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20  Connect(pParse, 
13080 70 54 61 62 6c 65 29 3b 0a 20 20 64 62 2d 3e 6e  pTable);.  db->n
13090 53 63 68 65 6d 61 4c 6f 63 6b 2d 2d 3b 0a 20 20  SchemaLock--;.  
130a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
130b0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
130c0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
130d0 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  le) ) return 0;.
130e0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
130f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
13100 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65  .  /* A positive
13110 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20   nCol means the 
13120 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f  columns names fo
13130 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a  r this view are.
13140 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f    ** already kno
13150 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  wn..  */.  if( p
13160 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20  Table->nCol>0 ) 
13170 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
13180 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20  A negative nCol 
13190 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72  is a special mar
131a0 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ker meaning that
131b0 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
131c0 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f  y.  ** trying to
131d0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c   compute the col
131e0 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77  umn names.  If w
131f0 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75  e enter this rou
13200 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61  tine with.  ** a
13210 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20   negative nCol, 
13220 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20  it means two or 
13230 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20  more views form 
13240 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69  a loop, like thi
13250 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
13260 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65   CREATE VIEW one
13270 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
13280 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20  M two;.  **     
13290 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20  CREATE VIEW two 
132a0 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
132b0 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
132c0 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72  Actually, the er
132d0 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77  ror above is now
132e0 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f   caught prior to
132f0 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70   reaching this p
13300 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74  oint..  ** But t
13310 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
13320 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72  t is still impor
13330 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20  tant as it does 
13340 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20  come up.  ** in 
13350 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
13360 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52   ** .  **     CR
13370 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e  EATE TABLE main.
13380 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20  ex1(a);.  **    
13390 20 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 45   CREATE TEMP VIE
133a0 57 20 65 78 31 20 41 53 20 53 45 4c 45 43 54 20  W ex1 AS SELECT 
133b0 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a  a FROM ex1;.  **
133c0 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
133d0 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a  OM temp.ex1;.  *
133e0 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
133f0 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71  nCol<0 ){.    sq
13400 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13410 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69  arse, "view %s i
13420 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66  s circularly def
13430 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ined", pTable->z
13440 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
13450 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 1;.  }.  asser
13460 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  t( pTable->nCol>
13470 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  =0 );..  /* If w
13480 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
13490 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
134a0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
134b0 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
134c0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
134d0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
134e0 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
134f0 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
13500 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
13510 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75  ents in the resu
13520 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76  lts set of the v
13530 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73  iew and will ass
13540 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ign cursors.  **
13550 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73   to the elements
13560 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
13570 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20  use.  But we do 
13580 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63  not want these c
13590 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  hanges.  ** to b
135a0 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f  e permanent.  So
135b0 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
135c0 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f   is done on a co
135d0 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
135e0 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
135f0 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
13600 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73   view..  */.  as
13610 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53  sert( pTable->pS
13620 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20  elect );.  pSel 
13630 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
13640 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  up(db, pTable->p
13650 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
13660 28 20 70 53 65 6c 20 29 7b 0a 23 69 66 6e 64 65  ( pSel ){.#ifnde
13670 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
13680 54 45 52 54 41 42 4c 45 0a 20 20 20 20 75 38 20  TERTABLE.    u8 
13690 65 50 61 72 73 65 4d 6f 64 65 20 3d 20 70 50 61  eParseMode = pPa
136a0 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 3b  rse->eParseMode;
136b0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50 61  .    pParse->ePa
136c0 72 73 65 4d 6f 64 65 20 3d 20 50 41 52 53 45 5f  rseMode = PARSE_
136d0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3b 0a 23 65 6e  MODE_NORMAL;.#en
136e0 64 69 66 0a 20 20 20 20 6e 20 3d 20 70 50 61 72  dif.    n = pPar
136f0 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71  se->nTab;.    sq
13700 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
13710 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
13720 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20  , pSel->pSrc);. 
13730 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
13740 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = -1;.    db->lo
13750 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
13760 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
13770 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
13780 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20  ATION.    xAuth 
13790 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20  = db->xAuth;.   
137a0 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a   db->xAuth = 0;.
137b0 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
137c0 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
137d0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
137e0 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41  Sel);.    db->xA
137f0 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c  uth = xAuth;.#el
13800 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d  se.    pSelTab =
13810 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
13820 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
13830 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a  , pSel);.#endif.
13840 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
13850 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 54   = n;.    if( pT
13860 61 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a  able->pCheck ){.
13870 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20        /* CREATE 
13880 56 49 45 57 20 6e 61 6d 65 28 61 72 67 6c 69 73  VIEW name(arglis
13890 74 29 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20  t) AS ....      
138a0 2a 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f 66 20  ** The names of 
138b0 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  the columns in t
138c0 68 65 20 74 61 62 6c 65 20 61 72 65 20 74 61 6b  he table are tak
138d0 65 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  en from.      **
138e0 20 61 72 67 6c 69 73 74 20 77 68 69 63 68 20 69   arglist which i
138f0 73 20 73 74 6f 72 65 64 20 69 6e 20 70 54 61 62  s stored in pTab
13900 6c 65 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68 65  le->pCheck.  The
13910 20 70 43 68 65 63 6b 20 66 69 65 6c 64 0a 20 20   pCheck field.  
13920 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20      ** normally 
13930 68 6f 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e 73  holds CHECK cons
13940 74 72 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72  traints on an or
13950 64 69 6e 61 72 79 20 74 61 62 6c 65 2c 20 62 75  dinary table, bu
13960 74 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61  t for.      ** a
13970 20 56 49 45 57 20 69 74 20 68 6f 6c 64 73 20 74   VIEW it holds t
13980 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
13990 6e 20 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a  n names..      *
139a0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  /.      sqlite3C
139b0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
139c0 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  st(pParse, pTabl
139d0 65 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20  e->pCheck, .    
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54               &pT
13a00 61 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  able->nCol, &pTa
13a10 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  ble->aCol);.    
13a20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
13a30 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20  Failed==0 .     
13a40 20 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72    && pParse->nEr
13a50 72 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  r==0.       && p
13a60 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65  Table->nCol==pSe
13a70 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l->pEList->nExpr
13a80 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
13a90 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
13aa0 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
13ab0 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
13ac0 20 70 54 61 62 6c 65 2c 20 70 53 65 6c 29 3b 0a   pTable, pSel);.
13ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
13ae0 65 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b  e if( pSelTab ){
13af0 0a 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45  .      /* CREATE
13b00 20 56 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e   VIEW name AS...
13b10 20 20 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67    without an arg
13b20 75 6d 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e  ument list.  Con
13b30 73 74 72 75 63 74 0a 20 20 20 20 20 20 2a 2a 20  struct.      ** 
13b40 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
13b50 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54   from the SELECT
13b60 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
13b70 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
13b80 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
13b90 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
13ba0 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
13bb0 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
13bc0 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
13bd0 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
13be0 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
13bf0 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  ol;.      pSelTa
13c00 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
13c10 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
13c20 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
13c30 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
13c40 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
13c50 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d  , pTable->pSchem
13c60 61 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  a) );.    }else{
13c70 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  .      pTable->n
13c80 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  Col = 0;.      n
13c90 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  Err++;.    }.   
13ca0 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
13cb0 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29  ble(db, pSelTab)
13cc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
13cd0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
13ce0 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  el);.    db->loo
13cf0 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2d  kaside.bDisable-
13d00 2d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  -;.#ifndef SQLIT
13d10 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
13d20 45 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50  E.    pParse->eP
13d30 61 72 73 65 4d 6f 64 65 20 3d 20 65 50 61 72 73  arseMode = ePars
13d40 65 4d 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 20 20  eMode;.#endif.  
13d50 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72  } else {.    nEr
13d60 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  r++;.  }.  pTabl
13d70 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  e->pSchema->sche
13d80 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e  maFlags |= DB_Un
13d90 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 69 66  resetViews;.  if
13da0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
13db0 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
13dc0 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d  3DeleteColumnNam
13dd0 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  es(db, pTable);.
13de0 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
13df0 20 3d 20 30 3b 0a 20 20 20 20 70 54 61 62 6c 65   = 0;.    pTable
13e00 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a  ->nCol = 0;.  }.
13e10 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13e20 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20  _OMIT_VIEW */.  
13e30 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
13e40 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
13e50 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13e60 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
13e70 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
13e80 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
13e90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13ea0 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43  MIT_VIEW./*.** C
13eb0 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
13ec0 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
13ed0 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
13ee0 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
13ef0 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
13f00 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33  ResetAll(sqlite3
13f10 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
13f20 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
13f30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13f40 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
13f50 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20  db, idx, 0) );. 
13f60 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
13f70 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
13f80 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
13f90 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
13fa0 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
13fb0 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53  &db->aDb[idx].pS
13fc0 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
13fd0 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e   i;i=sqliteHashN
13fe0 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62  ext(i)){.    Tab
13ff0 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
14000 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
14010 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
14020 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
14030 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  ite3DeleteColumn
14040 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b  Names(db, pTab);
14050 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  .      pTab->aCo
14060 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61  l = 0;.      pTa
14070 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
14080 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
14090 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
140a0 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
140b0 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
140c0 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
140d0 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
140e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
140f0 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
14100 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
14110 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
14120 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
14130 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
14140 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
14150 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
14160 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
14170 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
14180 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
14190 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
141a0 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
141b0 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
141c0 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
141d0 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a  ** to iTo..**.**
141e0 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20   Ticket #1728:  
141f0 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65  The symbol table
14200 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e   might still con
14210 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tain information
14220 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e  .** on tables an
14230 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61  d/or indices tha
14240 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73  t are the proces
14250 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74  s of being delet
14260 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72  ed..** If you ar
14270 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f  e unlucky, one o
14280 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20  f those deleted 
14290 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65  indices or table
142a0 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20  s might.** have 
142b0 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67  the same rootpag
142c0 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  e number as the 
142d0 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e  real table or in
142e0 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62  dex that is.** b
142f0 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20  eing moved.  So 
14300 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73  we cannot stop s
14310 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74  earching after t
14320 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a  he first match .
14330 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
14340 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74  irst match might
14350 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
14360 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  he deleted indic
14370 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20  es.** or tables 
14380 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c  and not the tabl
14390 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  e/index that is 
143a0 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d  actually being m
143b0 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74  oved..** We must
143c0 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e   continue loopin
143d0 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c  g until all tabl
143e0 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77  es and indices w
143f0 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d  ith.** rootpage=
14400 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e  =iFrom have been
14410 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61   converted to ha
14420 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66  ve a rootpage of
14430 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72   iTo.** in order
14440 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74   to be certain t
14450 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72  hat we got the r
14460 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66  ight one..*/.#if
14470 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14480 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64  _AUTOVACUUM.void
14490 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65   sqlite3RootPage
144a0 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a 64  Moved(sqlite3 *d
144b0 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
144c0 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
144d0 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
144e0 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  em;.  Hash *pHas
144f0 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  h;.  Db *pDb;.. 
14500 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14510 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
14520 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
14530 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
14540 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20  iDb];.  pHash = 
14550 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
14560 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  blHash;.  for(pE
14570 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
14580 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
14590 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
145a0 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
145b0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
145c0 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
145d0 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
145e0 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pTab->tnum==iF
145f0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61  rom ){.      pTa
14600 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  b->tnum = iTo;. 
14610 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68     }.  }.  pHash
14620 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
14630 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72  ->idxHash;.  for
14640 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
14650 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
14660 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
14670 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
14680 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
14690 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
146a0 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
146b0 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d   if( pIdx->tnum=
146c0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
146d0 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pIdx->tnum = iTo
146e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
146f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
14700 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  e code to erase 
14710 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
14720 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
14730 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44  from database iD
14740 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65  b..** Also write
14750 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20   code to modify 
14760 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
14770 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65  r table and inte
14780 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69  rnal schema.** i
14790 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  f a root-page of
147a0 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
147b0 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
147c0 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73  tree-layer whils
147d0 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61  t.** erasing iTa
147e0 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61  ble (this can ha
147f0 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
14800 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
14810 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  e)..*/ .static v
14820 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  oid destroyRootP
14830 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  age(Parse *pPars
14840 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  e, int iTable, i
14850 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
14860 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
14870 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
14880 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
14890 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
148a0 29 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c  );.  if( iTable<
148b0 32 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72  2 ) sqlite3Error
148c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
148d0 72 75 70 74 20 73 63 68 65 6d 61 22 29 3b 0a 20  rupt schema");. 
148e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
148f0 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  p3(v, OP_Destroy
14900 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44  , iTable, r1, iD
14910 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 79  b);.  sqlite3May
14920 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 23  Abort(pParse);.#
14930 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14940 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
14950 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73 74  /* OP_Destroy st
14960 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65 67  ores an in integ
14970 65 72 20 72 31 2e 20 49 66 20 74 68 69 73 20 69  er r1. If this i
14980 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e  nteger.  ** is n
14990 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
149a0 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
149b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61  e number of a ta
149c0 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a  ble moved to.  *
149d0 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c  * location iTabl
149e0 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
149f0 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74   code modifies t
14a00 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
14a10 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72   table to.  ** r
14a20 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a  eflect this..  *
14a30 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e  *.  ** The "#NNN
14a40 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20  " in the SQL is 
14a50 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61  a special consta
14a60 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68  nt that means wh
14a70 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a  atever value.  *
14a80 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72  * is in register
14a90 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d   NNN.  See gramm
14aa0 61 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69 61  ar rules associa
14ab0 74 65 64 20 77 69 74 68 20 74 68 65 20 54 4b 5f  ted with the TK_
14ac0 52 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f  REGISTER.  ** to
14ad0 6b 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ken for addition
14ae0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
14af0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
14b00 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
14b10 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20  , .     "UPDATE 
14b20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61  %Q.%s SET rootpa
14b30 67 65 3d 25 64 20 57 48 45 52 45 20 23 25 64 20  ge=%d WHERE #%d 
14b40 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64  AND rootpage=#%d
14b50 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ",.     pParse->
14b60 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
14b70 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
14b80 4d 45 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20  ME, iTable, r1, 
14b90 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  r1);.#endif.  sq
14ba0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
14bb0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
14bc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
14bd0 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61  VDBE code to era
14be0 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  se table pTab an
14bf0 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64  d all associated
14c00 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b   indices on disk
14c10 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64  ..** Code to upd
14c20 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ate the sqlite_m
14c30 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64  aster tables and
14c40 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
14c50 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20   definitions.** 
14c60 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70  in case a root-p
14c70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
14c80 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
14c90 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
14ca0 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73  tree layer.** is
14cb0 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69   also added (thi
14cc0 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
14cd0 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
14ce0 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73   database)..*/.s
14cf0 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
14d00 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  oyTable(Parse *p
14d10 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
14d20 61 62 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  ab){.  /* If the
14d30 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
14d40 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70   auto-vacuum cap
14d50 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f  able (if SQLITE_
14d60 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
14d70 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69    ** is not defi
14d80 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73  ned), then it is
14d90 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61   important to ca
14da0 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e  ll OP_Destroy on
14db0 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20   the.  ** table 
14dc0 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70  and index root-p
14dd0 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73  ages in order, s
14de0 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
14df0 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20   numerically .  
14e00 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  ** largest root-
14e10 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69  page number. Thi
14e20 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  s guarantees tha
14e30 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  t none of the ro
14e40 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f  ot-pages.  ** to
14e50 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73   be destroyed is
14e60 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e   relocated by an
14e70 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74   earlier OP_Dest
14e80 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  roy. i.e. if the
14e90 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
14ea0 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a  were coded:.  **
14eb0 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
14ec0 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20   4 0.  ** ....  
14ed0 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  ** OP_Destroy 5 
14ee0 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  0.  **.  ** and 
14ef0 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70  root page 5 happ
14f00 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  ened to be the l
14f10 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
14f20 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20   number in the. 
14f30 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
14f40 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77  en root page 5 w
14f50 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f  ould be moved to
14f60 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a   page 4 by the .
14f70 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79    ** "OP_Destroy
14f80 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68   4 0" opcode. Th
14f90 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50  e subsequent "OP
14fa0 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f  _Destroy 5 0" wo
14fb0 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66  uld hit.  ** a f
14fc0 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20  ree-list page.. 
14fd0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
14fe0 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69   pTab->tnum;.  i
14ff0 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20  nt iDestroyed = 
15000 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29  0;..  while( 1 )
15010 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
15020 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67  x;.    int iLarg
15030 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  est = 0;..    if
15040 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20  ( iDestroyed==0 
15050 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79  || iTab<iDestroy
15060 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72  ed ){.      iLar
15070 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20  gest = iTab;.   
15080 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d   }.    for(pIdx=
15090 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
150a0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
150b0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
150c0 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e   iIdx = pIdx->tn
150d0 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  um;.      assert
150e0 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d  ( pIdx->pSchema=
150f0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
15100 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65  ;.      if( (iDe
15110 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69  stroyed==0 || (i
15120 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29  Idx<iDestroyed))
15130 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73   && iIdx>iLarges
15140 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61  t ){.        iLa
15150 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20  rgest = iIdx;.  
15160 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15170 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20  if( iLargest==0 
15180 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ){.      return;
15190 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
151a0 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
151b0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
151c0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
151d0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
151e0 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d     assert( iDb>=
151f0 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d  0 && iDb<pParse-
15200 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  >db->nDb );.    
15210 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
15220 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
15230 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  st, iDb);.      
15240 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61  iDestroyed = iLa
15250 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  rgest;.    }.  }
15260 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
15270 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68   entries from th
15280 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74  e sqlite_statN t
15290 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e 20  ables (for N in 
152a0 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65  (1,2,3)).** afte
152b0 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f  r a DROP INDEX o
152c0 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d  r DROP TABLE com
152d0 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
152e0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
152f0 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50  rStatTables(.  P
15300 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15310 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
15320 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
15330 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20    int iDb,      
15340 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15350 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
15360 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
15370 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22  *zType,     /* "
15380 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f  idx" or "tbl" */
15390 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
153a0 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Name      /* Nam
153b0 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61  e of index or ta
153c0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
153d0 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
153e0 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72 73  *zDbName = pPars
153f0 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
15400 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 66 6f 72 28  zDbSName;.  for(
15410 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b  i=1; i<=4; i++){
15420 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32  .    char zTab[2
15430 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  4];.    sqlite3_
15440 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
15450 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69  zTab),zTab,"sqli
15460 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20  te_stat%d",i);. 
15470 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
15480 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
15490 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d  db, zTab, zDbNam
154a0 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
154b0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
154c0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
154d0 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
154e0 73 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a  s WHERE %s=%Q",.
154f0 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c          zDbName,
15500 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e   zTab, zType, zN
15510 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
15520 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
15530 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
15540 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a   drop a table..*
15550 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
15560 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  deDropTable(Pars
15570 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
15580 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c   *pTab, int iDb,
15590 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20   int isView){.  
155a0 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
155b0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
155c0 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a  >db;.  Trigger *
155d0 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a  pTrigger;.  Db *
155e0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
155f0 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  Db];..  v = sqli
15600 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
15610 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
15620 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  =0 );.  sqlite3B
15630 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
15640 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
15650 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
15660 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
15670 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
15680 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
15690 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
156a0 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp0(v, OP_VBegi
156b0 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  n);.  }.#endif..
156c0 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
156d0 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
156e0 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
156f0 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
15700 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e  Code.  ** is gen
15710 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65  erated to remove
15720 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71   entries from sq
15730 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f  lite_master and/
15740 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74  or.  ** sqlite_t
15750 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65  emp_master if re
15760 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  quired..  */.  p
15770 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65  Trigger = sqlite
15780 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61  3TriggerList(pPa
15790 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68  rse, pTab);.  wh
157a0 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b  ile( pTrigger ){
157b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72  .    assert( pTr
157c0 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
157d0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c  pTab->pSchema ||
157e0 20 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67   .        pTrigg
157f0 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  er->pSchema==db-
15800 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
15810 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72  );.    sqlite3Dr
15820 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
15830 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a  rse, pTrigger);.
15840 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
15850 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
15860 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
15870 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
15880 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f  REMENT.  /* Remo
15890 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f  ve any entries o
158a0 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  f the sqlite_seq
158b0 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f  uence table asso
158c0 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a  ciated with.  **
158d0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
158e0 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69   dropped. This i
158f0 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68  s done before th
15900 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70  e table is dropp
15910 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62  ed.  ** at the b
15920 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63  tree level, in c
15930 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ase the sqlite_s
15940 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65  equence table ne
15950 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65  eds to.  ** move
15960 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
15970 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61  the drop (can ha
15980 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63  ppen in auto-vac
15990 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a  uum mode)..  */.
159a0 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46    if( pTab->tabF
159b0 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
159c0 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73  crement ){.    s
159d0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
159e0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
159f0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
15a00 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
15a10 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
15a20 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
15a30 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
15a40 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  .    );.  }.#end
15a50 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
15a60 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
15a70 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
15a80 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
15a90 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74  er to the.  ** t
15aa0 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
15ab0 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
15ac0 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
15ad0 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
15ae0 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77  s.  ** every row
15af0 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
15b00 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
15b10 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
15b20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64  one being.  ** d
15b30 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
15b40 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
15b50 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  arately because 
15b60 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
15b70 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
15b80 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
15b90 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
15ba0 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
15bb0 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61  ther.  ** databa
15bc0 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  se..  */.  sqlit
15bd0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
15be0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45  arse, .      "DE
15bf0 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
15c00 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
15c10 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
15c20 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44  gger'",.      pD
15c30 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53  b->zDbSName, MAS
15c40 54 45 52 5f 4e 41 4d 45 2c 20 70 54 61 62 2d 3e  TER_NAME, pTab->
15c50 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69  zName);.  if( !i
15c60 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72 74  sView && !IsVirt
15c70 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
15c80 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50   destroyTable(pP
15c90 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d  arse, pTab);.  }
15ca0 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
15cb0 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72  e table entry fr
15cc0 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65  om SQLite's inte
15cd0 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20  rnal schema and 
15ce0 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20  modify.  ** the 
15cf0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20  schema cookie.. 
15d00 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
15d10 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
15d20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15d30 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f  p4(v, OP_VDestro
15d40 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  y, iDb, 0, 0, pT
15d50 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
15d60 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
15d70 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  rt(pParse);.  }.
15d80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15d90 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61  Op4(v, OP_DropTa
15da0 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  ble, iDb, 0, 0, 
15db0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
15dc0 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  .  sqlite3Change
15dd0 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
15de0 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65  Db);.  sqliteVie
15df0 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44  wResetAll(db, iD
15e00 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  b);.}../*.** Thi
15e10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
15e20 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
15e30 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
15e40 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
15e50 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
15e60 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
15e70 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
15e80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
15e90 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
15ea0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
15eb0 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
15ec0 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20  w, int noErr){. 
15ed0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
15ee0 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
15ef0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
15f00 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
15f10 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
15f20 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
15f30 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
15f40 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ble;.  }.  asser
15f50 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
15f60 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
15f70 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
15f80 3b 0a 20 20 69 66 28 20 21 49 73 52 65 75 73 65  ;.  if( !IsReuse
15f90 53 63 68 65 6d 61 28 64 62 29 20 26 26 20 73 71  Schema(db) && sq
15fa0 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
15fb0 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65  pParse) ) goto e
15fc0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
15fd0 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62    if( noErr ) db
15fe0 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b 3b  ->suppressErr++;
15ff0 0a 20 20 61 73 73 65 72 74 28 20 69 73 56 69 65  .  assert( isVie
16000 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d  w==0 || isView==
16010 4c 4f 43 41 54 45 5f 56 49 45 57 20 29 3b 0a 20  LOCATE_VIEW );. 
16020 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
16030 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
16040 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 26  Parse, isView, &
16050 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20  pName->a[0]);.  
16060 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e  if( noErr ) db->
16070 73 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a  suppressErr--;..
16080 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
16090 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29  .    if( noErr )
160a0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
160b0 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50  fyNamedSchema(pP
160c0 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  arse, pName->a[0
160d0 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
160e0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
160f0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44  _table;.  }.  iD
16100 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
16110 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
16120 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61  b->pSchema);.  a
16130 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
16140 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
16150 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 57    sqlite3SchemaW
16160 72 69 74 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ritable(pParse, 
16170 69 44 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  iDb);..  /* If p
16180 54 61 62 20 69 73 20 61 20 76 69 72 74 75 61 6c  Tab is a virtual
16190 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65   table, call Vie
161a0 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
161b0 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a  ) to ensure.  **
161c0 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a   it is initializ
161d0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ed..  */.  if( I
161e0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26  sVirtual(pTab) &
161f0 26 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  & sqlite3ViewGet
16200 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
16210 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20  se, pTab) ){.   
16220 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
16230 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64  table;.  }.#ifnd
16240 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
16250 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
16260 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
16270 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
16280 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
16290 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e  LE(iDb);.    con
162a0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
162b0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
162c0 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
162d0 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b  char *zArg2 = 0;
162e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
162f0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
16300 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
16310 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b   zTab, 0, zDb)){
16320 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
16330 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
16340 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
16350 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
16360 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
16370 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
16380 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
16390 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ROP_TEMP_VIEW;. 
163a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
163b0 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
163c0 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20  E_DROP_VIEW;.   
163d0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
163e0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
163f0 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20  TABLE.    }else 
16400 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
16410 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ab) ){.      cod
16420 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
16430 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41  VTABLE;.      zA
16440 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74  rg2 = sqlite3Get
16450 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
16460 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23  ->pMod->zName;.#
16470 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
16480 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
16490 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
164a0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
164b0 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
164c0 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
164d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
164e0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
164f0 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ROP_TABLE;.     
16500 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
16510 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
16520 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
16530 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72  pTab->zName, zAr
16540 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  g2, zDb) ){.    
16550 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
16560 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
16570 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
16580 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
16590 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54  QLITE_DELETE, pT
165a0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  ab->zName, 0, zD
165b0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
165c0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
165d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
165e0 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  if.  if( sqlite3
165f0 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
16600 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
16610 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73   7)==0 .    && s
16620 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
16630 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
16640 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21 3d  ite_stat", 11)!=
16650 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
16660 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16670 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
16680 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
16690 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
166a0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
166b0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  _table;.  }..#if
166c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
166d0 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72  _VIEW.  /* Ensur
166e0 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20  e DROP TABLE is 
166f0 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69  not used on a vi
16700 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45  ew, and DROP VIE
16710 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20  W is not used.  
16720 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20  ** on a table.. 
16730 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77   */.  if( isView
16740 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
16750 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
16760 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
16770 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41  se, "use DROP TA
16780 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61  BLE to delete ta
16790 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  ble %s", pTab->z
167a0 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
167b0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
167c0 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69  .  }.  if( !isVi
167d0 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
167e0 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
167f0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
16800 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45  e, "use DROP VIE
16810 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77  W to delete view
16820 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
16830 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
16840 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
16850 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
16860 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
16870 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
16880 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
16890 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64   table.  ** on d
168a0 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  isk..  */.  v = 
168b0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
168c0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
168d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
168e0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
168f0 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
16900 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69  );.    if( !isVi
16910 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ew ){.      sqli
16920 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
16930 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  es(pParse, iDb, 
16940 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  "tbl", pTab->zNa
16950 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
16960 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50  e3FkDropTable(pP
16970 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61  arse, pName, pTa
16980 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  b);.    }.    sq
16990 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62  lite3CodeDropTab
169a0 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
169b0 20 69 44 62 2c 20 69 73 56 69 65 77 29 3b 0a 20   iDb, isView);. 
169c0 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61   }..exit_drop_ta
169d0 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  ble:.  sqlite3Sr
169e0 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
169f0 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
16a00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
16a10 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
16a20 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20  e a new foreign 
16a30 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  key on the table
16a40 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
16a50 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
16a60 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65  .  pFromCol dete
16a70 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c  rmines which col
16a80 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63  umns.** in the c
16a90 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69  urrent table poi
16aa0 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67  nt to the foreig
16ab0 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d  n key.  If pFrom
16ac0 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63  Col==0 then.** c
16ad0 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74  onnect the key t
16ae0 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  o the last colum
16af0 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f  n inserted.  pTo
16b00 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a   is the name of.
16b10 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66  ** the table ref
16b20 65 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20  erred to (a.k.a 
16b30 74 68 65 20 22 70 61 72 65 6e 74 22 20 74 61 62  the "parent" tab
16b40 6c 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20  le).  pToCol is 
16b50 61 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62  a list.** of tab
16b60 6c 65 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e  les in the paren
16b70 74 20 70 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c  t pTo table.  fl
16b80 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ags contains all
16b90 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
16ba0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69  about the confli
16bb0 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
16bc0 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69  gorithms specifi
16bd0 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  ed.** in the ON 
16be0 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54  DELETE, ON UPDAT
16bf0 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20  E and ON INSERT 
16c00 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  clauses..**.** A
16c10 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65  n FKey structure
16c20 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
16c30 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
16c40 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  le currently.** 
16c50 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
16c60 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  on in the pParse
16c70 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c  ->pNewTable fiel
16c80 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  d..**.** The for
16c90 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20  eign key is set 
16ca0 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72  for IMMEDIATE pr
16cb0 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62  ocessing.  A sub
16cc0 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20  sequent call.** 
16cd0 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  to sqlite3DeferF
16ce0 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68  oreignKey() migh
16cf0 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f  t change this to
16d00 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f   DEFERRED..*/.vo
16d10 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
16d20 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61  ForeignKey(.  Pa
16d30 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
16d40 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
16d50 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
16d60 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20  ist *pFromCol,  
16d70 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
16d80 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f  is table that po
16d90 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62  int to other tab
16da0 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
16db0 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  To,          /* 
16dc0 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65  Name of the othe
16dd0 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  r table */.  Exp
16de0 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20  rList *pToCol,  
16df0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
16e00 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
16e10 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
16e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
16e30 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
16e40 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a   algorithms. */.
16e50 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
16e60 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23   = pParse->db;.#
16e70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16e80 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
16e90 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30   FKey *pFKey = 0
16ea0 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54  ;.  FKey *pNextT
16eb0 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  o;.  Table *p = 
16ec0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
16ed0 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  e;.  int nByte;.
16ee0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
16ef0 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  Col;.  char *z;.
16f00 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d  .  assert( pTo!=
16f10 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
16f20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
16f30 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  AB ) goto fk_end
16f40 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
16f50 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
16f60 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  Col = p->nCol-1;
16f70 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 69  .    if( NEVER(i
16f80 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b  Col<0) ) goto fk
16f90 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54  _end;.    if( pT
16fa0 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
16fb0 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
16fc0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16fd0 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69  g(pParse, "forei
16fe0 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20  gn key on %s".  
16ff0 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20         " should 
17000 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
17010 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ne column of tab
17020 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20  le %T",.        
17030 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a   p->aCol[iCol].z
17040 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20  Name, pTo);.    
17050 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
17060 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
17070 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
17080 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
17090 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c  >nExpr!=pFromCol
170a0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
170b0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
170c0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
170d0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
170e0 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  s in foreign key
170f0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
17100 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a  the number of ".
17110 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73          "columns
17120 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
17130 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20  ed table");.    
17140 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
17150 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
17160 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72   pFromCol->nExpr
17170 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
17180 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b  sizeof(*pFKey) +
17190 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66   (nCol-1)*sizeof
171a0 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29  (pFKey->aCol[0])
171b0 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20   + pTo->n + 1;. 
171c0 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
171d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
171e0 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  oCol->nExpr; i++
171f0 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
17200 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
17210 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  0(pToCol->a[i].z
17220 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d  Name) + 1;.    }
17230 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73  .  }.  pFKey = s
17240 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
17250 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  ro(db, nByte );.
17260 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29    if( pFKey==0 )
17270 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  {.    goto fk_en
17280 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e  d;.  }.  pFKey->
17290 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b  pFrom = p;.  pFK
172a0 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20  ey->pNextFrom = 
172b0 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20  p->pFKey;.  z = 
172c0 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61  (char*)&pFKey->a
172d0 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b  Col[nCol];.  pFK
172e0 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 69  ey->zTo = z;.  i
172f0 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
17300 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ECT ){.    sqlit
17310 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70  e3RenameTokenMap
17320 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29  (pParse, (void*)
17330 7a 2c 20 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 6d  z, pTo);.  }.  m
17340 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
17350 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
17360 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  o->n] = 0;.  sql
17370 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a  ite3Dequote(z);.
17380 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
17390 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d  .  pFKey->nCol =
173a0 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72   nCol;.  if( pFr
173b0 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
173c0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69  pFKey->aCol[0].i
173d0 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  From = p->nCol-1
173e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
173f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
17400 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
17410 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
17420 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ; j<p->nCol; j++
17430 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
17440 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d  qlite3StrICmp(p-
17450 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
17460 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
17470 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
17480 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
17490 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a  l[i].iFrom = j;.
174a0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
174b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
174c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
174d0 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  p->nCol ){.     
174e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
174f0 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
17500 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63        "unknown c
17510 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20  olumn \"%s\" in 
17520 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
17530 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20  nition", .      
17540 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b      pFromCol->a[
17550 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
17560 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
17570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17580 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
17590 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CT ){.        sq
175a0 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
175b0 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 26 70  Remap(pParse, &p
175c0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2c 20 70  FKey->aCol[i], p
175d0 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
175e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
175f0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54    }.  }.  if( pT
17600 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
17610 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
17620 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
17630 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
17640 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
17650 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65  ame);.      pFKe
17660 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20  y->aCol[i].zCol 
17670 3d 20 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 49  = z;.      if( I
17680 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
17690 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
176a0 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d  e3RenameTokenRem
176b0 61 70 28 70 50 61 72 73 65 2c 20 7a 2c 20 70 54  ap(pParse, z, pT
176c0 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
176d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
176e0 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f   memcpy(z, pToCo
176f0 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e  l->a[i].zName, n
17700 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20  );.      z[n] = 
17710 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b  0;.      z += n+
17720 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
17730 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
17740 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61   = 0;.  pFKey->a
17750 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29  Action[0] = (u8)
17760 28 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20  (flags & 0xff); 
17770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e             /* ON
17780 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a   DELETE action *
17790 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69  /.  pFKey->aActi
177a0 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c  on[1] = (u8)((fl
177b0 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66  ags >> 8 ) & 0xf
177c0 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44  f);    /* ON UPD
177d0 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20  ATE action */.. 
177e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
177f0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
17800 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d  db, 0, p->pSchem
17810 61 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20  a) );.  pNextTo 
17820 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65  = (FKey *)sqlite
17830 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e  3HashInsert(&p->
17840 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73  pSchema->fkeyHas
17850 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  h, .      pFKey-
17860 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46  >zTo, (void *)pF
17870 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70  Key.  );.  if( p
17880 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b  NextTo==pFKey ){
17890 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
178a0 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 67 6f  ault(db);.    go
178b0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
178c0 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a   if( pNextTo ){.
178d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 78      assert( pNex
178e0 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20  tTo->pPrevTo==0 
178f0 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e  );.    pFKey->pN
17900 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b  extTo = pNextTo;
17910 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50  .    pNextTo->pP
17920 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20  revTo = pFKey;. 
17930 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
17940 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f  e foreign key to
17950 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68   the table as th
17960 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a  e last step..  *
17970 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70  /.  p->pFKey = p
17980 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20  FKey;.  pFKey = 
17990 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71  0;..fk_end:.  sq
179a0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
179b0 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f  pFKey);.#endif /
179c0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
179d0 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
179e0 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  EY) */.  sqlite3
179f0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
17a00 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20  b, pFromCol);.  
17a10 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
17a20 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c  elete(db, pToCol
17a30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
17a40 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
17a50 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49  ed when an INITI
17a60 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f  ALLY IMMEDIATE o
17a70 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
17a80 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69  RRED.** clause i
17a90 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f  s seen as part o
17aa0 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  f a foreign key 
17ab0 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65  definition.  The
17ac0 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70   isDeferred.** p
17ad0 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f  arameter is 1 fo
17ae0 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
17af0 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49  RRED and 0 for I
17b00 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
17b10 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76  TE..** The behav
17b20 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ior of the most 
17b30 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
17b40 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
17b50 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f  adjusted.** acco
17b60 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rdingly..*/.void
17b70 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
17b80 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70  eignKey(Parse *p
17b90 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66  Parse, int isDef
17ba0 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20  erred){.#ifndef 
17bb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
17bc0 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20  IGN_KEY.  Table 
17bd0 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70  *pTab;.  FKey *p
17be0 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61  FKey;.  if( (pTa
17bf0 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
17c00 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46  Table)==0 || (pF
17c10 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65  Key = pTab->pFKe
17c20 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  y)==0 ) return;.
17c30 20 20 61 73 73 65 72 74 28 20 69 73 44 65 66 65    assert( isDefe
17c40 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66  rred==0 || isDef
17c50 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45  erred==1 ); /* E
17c60 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37  V: R-30323-21917
17c70 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44   */.  pFKey->isD
17c80 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 69 73  eferred = (u8)is
17c90 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66  Deferred;.#endif
17ca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
17cb0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
17cc0 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69  l erase and refi
17cd0 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20  ll index *pIdx. 
17ce0 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64   This is.** used
17cf0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   to initialize a
17d00 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69   newly created i
17d10 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d  ndex or to recom
17d20 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  pute the.** cont
17d30 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  ent of an index 
17d40 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  in response to a
17d50 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
17d60 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f  ..**.** if memRo
17d70 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65  otPage is not ne
17d80 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73  gative, it means
17d90 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
17da0 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61  is newly.** crea
17db0 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 73 74  ted.  The regist
17dc0 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20  er specified by 
17dd0 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74  memRootPage cont
17de0 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  ains the.** root
17df0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
17e00 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d  the index.  If m
17e10 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65  emRootPage is ne
17e20 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20  gative, then.** 
17e30 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
17e40 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73  y exists and mus
17e50 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  t be cleared bef
17e60 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c  ore being refill
17e70 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f  ed and.** the ro
17e80 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
17e90 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  f the index is t
17ea0 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78  aken from pIndex
17eb0 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  ->tnum..*/.stati
17ec0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  c void sqlite3Re
17ed0 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20  fillIndex(Parse 
17ee0 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
17ef0 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52  pIndex, int memR
17f00 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c  ootPage){.  Tabl
17f10 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
17f20 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68  ->pTable;  /* Th
17f30 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
17f40 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
17f50 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
17f60 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
17f70 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
17f80 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69   for pTab */.  i
17f90 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65  nt iIdx = pParse
17fa0 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
17fb0 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
17fc0 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f  ed for pIndex */
17fd0 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20  .  int iSorter; 
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
18000 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72  ed by OpenSorter
18010 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a   (if in use) */.
18020 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
18030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18040 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
18050 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  op of loop */.  
18060 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20 20  int addr2;      
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18080 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d  * Address to jum
18090 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74  p to for next it
180a0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
180b0 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20   tnum;          
180c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
180d0 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65  oot page of inde
180e0 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74  x */.  int iPart
180f0 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  IdxLabel;       
18100 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f        /* Jump to
18110 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73   this label to s
18120 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56  kip a row */.  V
18130 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18150 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
18160 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c  nto this virtual
18170 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65   machine */.  Ke
18180 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20  yInfo *pKey;    
18190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
181a0 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65  KeyInfo for inde
181b0 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  x */.  int regRe
181c0 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  cord;           
181d0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
181e0 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62  r holding assemb
181f0 6c 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  led index record
18200 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
18210 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
18220 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
18230 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
18240 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73  */.  int iDb = s
18250 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
18260 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e  dex(db, pIndex->
18270 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64  pSchema);..#ifnd
18280 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
18290 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
182a0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
182b0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
182c0 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64  TE_REINDEX, pInd
182d0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20  ex->zName, 0,.  
182e0 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
182f0 2e 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20  .zDbSName ) ){. 
18300 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
18310 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75  endif..  /* Requ
18320 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
18330 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f   on the table to
18340 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70   perform this op
18350 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  eration */.  sql
18360 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
18370 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
18380 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e  >tnum, 1, pTab->
18390 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73  zName);..  v = s
183a0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
183b0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
183c0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
183d0 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
183e0 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d   ){.    tnum = m
183f0 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65  emRootPage;.  }e
18400 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  lse{.    tnum = 
18410 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20  pIndex->tnum;.  
18420 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74  }.  pKey = sqlit
18430 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
18440 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29  (pParse, pIndex)
18450 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
18460 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
18470 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
18480 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f 2a  e->nErr );..  /*
18490 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72   Open the sorter
184a0 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72   cursor if we ar
184b0 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f  e to use one. */
184c0 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61  .  iSorter = pPa
184d0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
184e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
184f0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  (v, OP_SorterOpe
18500 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70  n, iSorter, 0, p
18510 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20  Index->nKeyCol, 
18520 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20  (char*).        
18530 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
18540 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
18550 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  ey), P4_KEYINFO)
18560 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
18570 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72   table. Loop thr
18580 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66  ough all rows of
18590 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65   the table, inse
185a0 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a  rting index.  **
185b0 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68   records into th
185c0 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73  e sorter. */.  s
185d0 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
185e0 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
185f0 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
18600 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d  Read);.  addr1 =
18610 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18620 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
18630 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43   iTab, 0); VdbeC
18640 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65  overage(v);.  re
18650 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
18660 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
18670 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 75  se);.  sqlite3Mu
18680 6c 74 69 57 72 69 74 65 28 70 50 61 72 73 65 29  ltiWrite(pParse)
18690 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  ;..  sqlite3Gene
186a0 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
186b0 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c  rse,pIndex,iTab,
186c0 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61  regRecord,0,&iPa
186d0 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b  rtIdxLabel,0,0);
186e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
186f0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
18700 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72  rInsert, iSorter
18710 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
18720 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61  sqlite3ResolvePa
18730 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73  rtIdxLabel(pPars
18740 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c  e, iPartIdxLabel
18750 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18760 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
18770 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31  t, iTab, addr1+1
18780 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
18790 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
187a0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
187b0 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  r1);.  if( memRo
187c0 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74  otPage<0 ) sqlit
187d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
187e0 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20  OP_Clear, tnum, 
187f0 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  iDb);.  sqlite3V
18800 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
18810 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c  OpenWrite, iIdx,
18820 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20   tnum, iDb, .   
18830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18840 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50   (char *)pKey, P
18850 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
18860 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
18870 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b  5(v, OPFLAG_BULK
18880 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67  CSR|((memRootPag
18890 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49  e>=0)?OPFLAG_P2I
188a0 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64  SREG:0));..  add
188b0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
188c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
188d0 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72  terSort, iSorter
188e0 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
188f0 67 65 28 76 29 3b 0a 20 20 69 66 28 20 49 73 55  ge(v);.  if( IsU
18900 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65  niqueIndex(pInde
18910 78 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32  x) ){.    int j2
18920 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f   = sqlite3VdbeGo
18930 74 6f 28 76 2c 20 31 29 3b 0a 20 20 20 20 61 64  to(v, 1);.    ad
18940 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
18950 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
18960 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18970 56 65 72 69 66 79 41 62 6f 72 74 61 62 6c 65 28  VerifyAbortable(
18980 76 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20  v, OE_Abort);.  
18990 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
189a0 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72  Op4Int(v, OP_Sor
189b0 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72  terCompare, iSor
189c0 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f  ter, j2, regReco
189d0 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
189e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
189f0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56  dex->nKeyCol); V
18a00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
18a10 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75      sqlite3Uniqu
18a20 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  eConstraint(pPar
18a30 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49  se, OE_Abort, pI
18a40 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  ndex);.    sqlit
18a50 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
18a60 2c 20 6a 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , j2);.  }else{.
18a70 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
18a80 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
18a90 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  dr(v);.  }.  sql
18aa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
18ab0 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c  , OP_SorterData,
18ac0 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63   iSorter, regRec
18ad0 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71  ord, iIdx);.  sq
18ae0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
18af0 76 2c 20 4f 50 5f 53 65 65 6b 45 6e 64 2c 20 69  v, OP_SeekEnd, i
18b00 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Idx);.  sqlite3V
18b10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18b20 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c  IdxInsert, iIdx,
18b30 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
18b40 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
18b50 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
18b60 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73  SEEKRESULT);.  s
18b70 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
18b80 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
18b90 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
18ba0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18bb0 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69  OP_SorterNext, i
18bc0 53 6f 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20  Sorter, addr2); 
18bd0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
18be0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
18bf0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
18c00 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ;..  sqlite3Vdbe
18c10 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
18c20 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c  se, iTab);.  sql
18c30 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
18c40 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78  , OP_Close, iIdx
18c50 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18c60 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
18c70 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a  se, iSorter);.}.
18c80 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
18c90 68 65 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f  heap space to ho
18ca0 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65  ld an Index obje
18cb0 63 74 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c  ct with nCol col
18cc0 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72  umns..**.** Incr
18cd0 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74  ease the allocat
18ce0 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76  ion size to prov
18cf0 69 64 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78  ide an extra nEx
18d00 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  tra bytes.** of 
18d10 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73  8-byte aligned s
18d20 70 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49  pace after the I
18d30 6e 64 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20  ndex object and 
18d40 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e  return a.** poin
18d50 74 65 72 20 74 6f 20 74 68 69 73 20 65 78 74 72  ter to this extr
18d60 61 20 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78  a space in *ppEx
18d70 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  tra..*/.Index *s
18d80 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e  qlite3AllocateIn
18d90 64 65 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c  dexObject(.  sql
18da0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
18db0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
18dc0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31  nnection */.  i1
18dd0 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  6 nCol,         
18de0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
18df0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
18e00 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
18e10 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
18e20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18e30 66 20 62 79 74 65 73 20 6f 66 20 65 78 74 72 61  f bytes of extra
18e40 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20   space to alloc 
18e50 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78  */.  char **ppEx
18e60 74 72 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  tra       /* Poi
18e70 6e 74 65 72 20 74 6f 20 74 68 65 20 22 65 78 74  nter to the "ext
18e80 72 61 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a  ra" space */.){.
18e90 20 20 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20    Index *p;     
18ea0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
18eb0 74 65 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  ted index object
18ec0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
18ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
18ee0 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
18ef0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20   Index object + 
18f00 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79  arrays */..  nBy
18f10 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
18f20 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20  of(Index)) +    
18f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
18f40 65 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f  ex structure  */
18f50 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44  .          ROUND
18f60 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  8(sizeof(char*)*
18f70 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20  nCol) +         
18f80 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20  /* Index.azColl 
18f90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
18fa0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c   ROUND8(sizeof(L
18fb0 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20  ogEst)*(nCol+1) 
18fc0 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61  +     /* Index.a
18fd0 69 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a  iRowLogEst   */.
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ff0 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f   sizeof(i16)*nCo
19000 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f  l +            /
19010 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e  * Index.aiColumn
19020 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
19030 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38         sizeof(u8
19040 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20  )*nCol);        
19050 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53       /* Index.aS
19060 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20  ortOrder */.  p 
19070 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
19080 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20  cZero(db, nByte 
19090 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  + nExtra);.  if(
190a0 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a   p ){.    char *
190b0 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a  pExtra = ((char*
190c0 29 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  )p)+ROUND8(sizeo
190d0 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70  f(Index));.    p
190e0 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73  ->azColl = (cons
190f0 74 20 63 68 61 72 2a 2a 29 70 45 78 74 72 61 3b  t char**)pExtra;
19100 20 70 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44   pExtra += ROUND
19110 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  8(sizeof(char*)*
19120 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69  nCol);.    p->ai
19130 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67  RowLogEst = (Log
19140 45 73 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78  Est*)pExtra; pEx
19150 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f  tra += sizeof(Lo
19160 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a  gEst)*(nCol+1);.
19170 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20      p->aiColumn 
19180 3d 20 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20  = (i16*)pExtra; 
19190 20 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20        pExtra += 
191a0 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c  sizeof(i16)*nCol
191b0 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72  ;.    p->aSortOr
191c0 64 65 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72  der = (u8*)pExtr
191d0 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d  a;.    p->nColum
191e0 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d  n = nCol;.    p-
191f0 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20  >nKeyCol = nCol 
19200 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72  - 1;.    *ppExtr
19210 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b  a = ((char*)p) +
19220 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65   nByte;.  }.  re
19230 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
19240 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
19250 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
19260 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e  able.  pName1.pN
19270 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65  ame2 is the name
19280 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
19290 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69  * and pTblList i
192a0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
192b0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
192c0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
192d0 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
192e0 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
192f0 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
19300 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
19310 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
19320 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
19330 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
19340 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
19350 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
19360 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
19370 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
19380 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
19390 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
193a0 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
193b0 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
193c0 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
193d0 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
193e0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
193f0 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
19400 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
19410 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
19420 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
19430 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
19440 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
19450 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
19460 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
19470 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
19480 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
19490 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
194a0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
194b0 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
194c0 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20  e3CreateIndex(. 
194d0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
194e0 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72      /* All infor
194f0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
19500 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b  s parse */.  Tok
19510 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
19520 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
19530 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
19540 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   be NULL */.  To
19550 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
19560 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
19570 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
19580 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
19590 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d  SrcList *pTblNam
195a0 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69  e, /* Table to i
195b0 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65  ndex. Use pParse
195c0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
195d0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
195e0 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
195f0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
19600 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
19610 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
19620 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c      /* OE_Abort,
19630 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52   OE_Ignore, OE_R
19640 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f  eplace, or OE_No
19650 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ne */.  Token *p
19660 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68  Start,     /* Th
19670 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
19680 68 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20  hat begins this 
19690 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45  statement */.  E
196a0 78 70 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20  xpr *pPIWhere,  
196b0 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
196c0 65 20 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e  e for partial in
196d0 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73  dices */.  int s
196e0 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a  ortOrder,     /*
196f0 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70   Sort order of p
19700 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20  rimary key when 
19710 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20  pList==NULL */. 
19720 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 2c   int ifNotExist,
19730 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f      /* Omit erro
19740 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61  r if index alrea
19750 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 75  dy exists */.  u
19760 38 20 69 64 78 54 79 70 65 20 20 20 20 20 20 20  8 idxType       
19770 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
19780 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ype */.){.  Tabl
19790 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
197a0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
197b0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64  indexed */.  Ind
197c0 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20  ex *pIndex = 0; 
197d0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
197e0 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  o be created */.
197f0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
19800 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  0;     /* Name o
19810 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  f the index */. 
19820 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
19830 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19840 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
19850 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20   zName */.  int 
19860 69 2c 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20  i, j;.  DbFixer 
19870 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  sFix;        /* 
19880 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61  For assigning da
19890 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20  tabase names to 
198a0 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  pTable */.  int 
198b0 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20  sortOrderMask;  
198c0 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44   /* 1 to honor D
198d0 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30  ESC in index.  0
198e0 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20   to ignore. */. 
198f0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
19900 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20  Parse->db;.  Db 
19910 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
19920 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69    /* The specifi
19930 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  c table containi
19940 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20 64  ng the indexed d
19950 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
19960 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
19970 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
19980 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
19990 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
199a0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
199b0 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e  me = 0;    /* Un
199c0 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f  qualified name o
199d0 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63  f the index to c
199e0 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  reate */.  struc
199f0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
19a00 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46  *pListItem; /* F
19a10 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
19a20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  pList */.  int n
19a30 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20  Extra = 0;      
19a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
19a50 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
19a60 6f 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20  or zExtra[] */. 
19a70 20 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20   int nExtraCol; 
19a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
19aa0 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  xtra columns nee
19ab0 64 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ded */.  char *z
19ac0 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20  Extra = 0;      
19ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
19ae0 72 61 20 73 70 61 63 65 20 61 66 74 65 72 20 74  ra space after t
19af0 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
19b00 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20  */.  Index *pPk 
19b10 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49  = 0;      /* PRI
19b20 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66  MARY KEY index f
19b30 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
19b40 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66   tables */..  if
19b50 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
19b60 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
19b70 72 72 3e 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rr>0 ){.    goto
19b80 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19b90 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e  ex;.  }.  if( IN
19ba0 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 26 26  _DECLARE_VTAB &&
19bb0 20 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45   idxType!=SQLITE
19bc0 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
19bd0 4b 45 59 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  KEY ){.    goto 
19be0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19bf0 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 49 73  x;.  }.  if( !Is
19c00 52 65 75 73 65 53 63 68 65 6d 61 28 64 62 29 20  ReuseSchema(db) 
19c10 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  && SQLITE_OK!=sq
19c20 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
19c30 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67  pParse) ){.    g
19c40 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19c50 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
19c60 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
19c70 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
19c80 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
19c90 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
19ca0 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
19cb0 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
19cc0 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  {..    /* Use th
19cd0 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78  e two-part index
19ce0 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
19cf0 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ne the database 
19d00 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63  .    ** to searc
19d10 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  h for the table.
19d20 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65   'Fix' the table
19d30 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62   name to this db
19d40 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c  .    ** before l
19d50 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61  ooking up the ta
19d60 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
19d70 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26  assert( pName1 &
19d80 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20  & pName2 );.    
19d90 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
19da0 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
19db0 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
19dc0 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66   &pName);.    if
19dd0 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65  ( iDb<0 ) goto e
19de0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19df0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
19e00 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20  ame && pName->z 
19e10 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
19e20 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20  TE_OMIT_TEMPDB. 
19e30 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
19e40 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75  ex name was unqu
19e50 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69  alified, check i
19e60 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  f the table.    
19e70 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62  ** is a temp tab
19e80 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74  le. If so, set t
19e90 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31  he database to 1
19ea0 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  . Do not do this
19eb0 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69  .    ** if initi
19ec0 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62 61  alising a databa
19ed0 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a  se schema..    *
19ee0 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  /.    if( !db->i
19ef0 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
19f00 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
19f10 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50  SrcListLookup(pP
19f20 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b  arse, pTblName);
19f30 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65  .      if( pName
19f40 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20  2->n==0 && pTab 
19f50 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  && pTab->pSchema
19f60 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
19f70 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
19f80 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  iDb = 1;.      }
19f90 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
19fa0 20 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69     sqlite3FixIni
19fb0 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
19fc0 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70   iDb, "index", p
19fd0 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73  Name);.    if( s
19fe0 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
19ff0 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65  (&sFix, pTblName
1a000 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65  ) ){.      /* Be
1a010 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72  cause the parser
1a020 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c   constructs pTbl
1a030 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67  Name from a sing
1a040 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20  le identifier,. 
1a050 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46       ** sqlite3F
1a060 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65  ixSrcList can ne
1a070 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20  ver fail. */.   
1a080 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
1a090 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73    }.    pTab = s
1a0a0 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
1a0b0 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c  eItem(pParse, 0,
1a0c0 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d   &pTblName->a[0]
1a0d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
1a0e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
1a0f0 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b  =0 || pTab==0 );
1a100 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30  .    if( pTab==0
1a110 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
1a120 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
1a130 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d  f( iDb==1 && db-
1a140 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
1a150 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a!=pTab->pSchema
1a160 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1a170 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1a180 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 63  , .           "c
1a190 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54  annot create a T
1a1a0 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e  EMP index on non
1a1b0 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73  -TEMP table \"%s
1a1c0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \"",.           
1a1d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
1a1e0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1a1f0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1a200 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f  }.    if( !HasRo
1a210 77 69 64 28 70 54 61 62 29 20 29 20 70 50 6b 20  wid(pTab) ) pPk 
1a220 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
1a230 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
1a240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1a250 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
1a260 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
1a270 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  art==0 );.    pT
1a280 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
1a290 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20  wTable;.    if( 
1a2a0 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
1a2b0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1a2c0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
1a2d0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
1a2e0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
1a2f0 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26  );.  }.  pDb = &
1a300 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
1a310 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
1a320 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1a330 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
1a340 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
1a350 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
1a360 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
1a370 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
1a380 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
1a390 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
1a3a0 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
1a3b0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1a3c0 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 70  3UserAuthTable(p
1a3d0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23  Tab->zName)==0.#
1a3e0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
1a3f0 49 54 45 5f 41 4c 4c 4f 57 5f 53 51 4c 49 54 45  ITE_ALLOW_SQLITE
1a400 5f 4d 41 53 54 45 52 5f 49 4e 44 45 58 0a 20 20  _MASTER_INDEX.  
1a410 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53       && sqlite3S
1a420 74 72 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e  trICmp(&pTab->zN
1a430 61 6d 65 5b 37 5d 2c 22 6d 61 73 74 65 72 22 29  ame[7],"master")
1a440 21 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  !=0.#endif.     
1a450 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
1a460 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d  ICmp(&pTab->zNam
1a470 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22  e[7],"altertab_"
1a480 2c 39 29 21 3d 30 0a 20 29 7b 0a 20 20 20 20 73  ,9)!=0. ){.    s
1a490 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a4a0 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
1a4b0 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
1a4c0 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  xed", pTab->zNam
1a4d0 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
1a4e0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1a4f0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1a500 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69  TE_OMIT_VIEW.  i
1a510 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
1a520 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1a530 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1a540 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62  "views may not b
1a550 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
1a560 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a570 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
1a580 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
1a590 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1a5a0 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
1a5b0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
1a5c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1a5d0 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75  g(pParse, "virtu
1a5e0 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f  al tables may no
1a5f0 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
1a600 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1a610 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
1a620 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
1a630 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  * Find the name 
1a640 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
1a650 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
1a660 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e  s not already an
1a670 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78  other.  ** index
1a680 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74   or table with t
1a690 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a  he same name.  .
1a6a0 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
1a6b0 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20  ion:  If we are 
1a6c0 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65  reading the name
1a6d0 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69  s of permanent i
1a6e0 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a  ndices from the.
1a6f0 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
1a700 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73  er table (becaus
1a710 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
1a720 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65  cess changed the
1a730 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a   schema) and.  *
1a740 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  * one of the ind
1a750 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65  ex names collide
1a760 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  s with the name 
1a770 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  of a temporary t
1a780 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64  able or.  ** ind
1a790 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ex, then we will
1a7a0 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f   continue to pro
1a7b0 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e  cess this index.
1a7c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e  .  **.  ** If pN
1a7d0 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
1a7e0 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a  that we are.  **
1a7f0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
1a800 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55  primary key or U
1a810 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
1a820 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  .  We have to in
1a830 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77  vent our.  ** ow
1a840 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  n name..  */.  i
1a850 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
1a860 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
1a870 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1a880 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
1a890 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
1a8a0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1a8b0 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
1a8c0 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20  pName->z!=0 );. 
1a8d0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
1a8e0 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
1a8f0 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
1a900 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
1a910 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a920 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
1a930 20 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d     if( !IN_RENAM
1a940 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
1a950 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
1a960 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  busy ){.        
1a970 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
1a980 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
1a990 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)!=0 ){.       
1a9a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1a9b0 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
1a9c0 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
1a9d0 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20  able named %s", 
1a9e0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
1a9f0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1aa00 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
1aa10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1aa20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
1aa30 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
1aa40 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29  , pDb->zDbSName)
1aa50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
1aa60 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29  f( !ifNotExist )
1aa70 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1aa80 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1aa90 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c  se, "index %s al
1aaa0 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a  ready exists", z
1aab0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Name);.        }
1aac0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1aad0 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
1aae0 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20  t.busy );.      
1aaf0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
1ab00 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
1ab10 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
1ab20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f    }.        goto
1ab30 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1ab40 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
1ab50 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
1ab60 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20  nt n;.    Index 
1ab70 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28  *pLoop;.    for(
1ab80 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64  pLoop=pTab->pInd
1ab90 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20  ex, n=1; pLoop; 
1aba0 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65  pLoop=pLoop->pNe
1abb0 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a  xt, n++){}.    z
1abc0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
1abd0 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
1abe0 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25  e_autoindex_%s_%
1abf0 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  d", pTab->zName,
1ac00 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61   n);.    if( zNa
1ac10 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  me==0 ){.      g
1ac20 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1ac30 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 0a 20 20  index;.    }..  
1ac40 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69    /* Automatic i
1ac50 6e 64 65 78 20 6e 61 6d 65 73 20 67 65 6e 65 72  ndex names gener
1ac60 61 74 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  ated from within
1ac70 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
1ac80 5f 76 74 61 62 28 29 0a 20 20 20 20 2a 2a 20 6d  _vtab().    ** m
1ac90 75 73 74 20 68 61 76 65 20 6e 61 6d 65 73 20 74  ust have names t
1aca0 68 61 74 20 61 72 65 20 64 69 73 74 69 6e 63 74  hat are distinct
1acb0 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75 74   from normal aut
1acc0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d  omatic index nam
1acd0 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66  es..    ** The f
1ace0 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
1acf0 6e 74 20 63 6f 6e 76 65 72 74 73 20 22 73 71 6c  nt converts "sql
1ad00 69 74 65 33 5f 61 75 74 6f 69 6e 64 65 78 2e 2e  ite3_autoindex..
1ad10 2e 22 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 22  ." into.    ** "
1ad20 73 71 6c 69 74 65 33 5f 62 75 74 6f 69 6e 64 65  sqlite3_butoinde
1ad30 78 2e 2e 2e 22 20 69 6e 20 6f 72 64 65 72 20 74  x..." in order t
1ad40 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 73  o make the names
1ad50 20 64 69 73 74 69 6e 63 74 2e 0a 20 20 20 20 2a   distinct..    *
1ad60 2a 20 54 68 65 20 22 76 74 61 62 5f 65 72 72 2e  * The "vtab_err.
1ad70 74 65 73 74 22 20 74 65 73 74 20 64 65 6d 6f 6e  test" test demon
1ad80 73 74 72 61 74 65 73 20 74 68 65 20 6e 65 65 64  strates the need
1ad90 20 6f 66 20 74 68 69 73 20 73 74 61 74 65 6d 65   of this stateme
1ada0 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49  nt. */.    if( I
1adb0 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20  N_SPECIAL_PARSE 
1adc0 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20  ) zName[7]++;.  
1add0 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
1ade0 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
1adf0 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
1ae00 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
1ae10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1ae20 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
1ae30 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45   !IN_RENAME_OBJE
1ae40 43 54 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  CT ){.    const 
1ae50 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d  char *zDb = pDb-
1ae60 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69  >zDbSName;.    i
1ae70 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1ae80 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1ae90 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
1aea0 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c  A_TABLE(iDb), 0,
1aeb0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
1aec0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1aed0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
1aee0 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
1aef0 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  TE_INDEX;.    if
1af00 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
1af10 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53  & iDb==1 ) i = S
1af20 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
1af30 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
1af40 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1af50 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61  k(pParse, i, zNa
1af60 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
1af70 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
1af80 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1af90 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
1afa0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1afb0 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65   pList==0, it me
1afc0 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ans this routine
1afd0 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d   was called to m
1afe0 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20  ake a primary.  
1aff0 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68  ** key out of th
1b000 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64  e last column ad
1b010 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
1b020 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1b030 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65  ion..  ** So cre
1b040 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20  ate a fake list 
1b050 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73  to simulate this
1b060 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  ..  */.  if( pLi
1b070 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54 6f 6b  st==0 ){.    Tok
1b080 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20 20 20  en prevCol;.    
1b090 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26  Column *pCol = &
1b0a0 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
1b0b0 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 20 20 70 43  >nCol-1];.    pC
1b0c0 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
1b0d0 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45 3b 0a  COLFLAG_UNIQUE;.
1b0e0 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
1b0f0 49 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c 20 70  Init(&prevCol, p
1b100 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
1b110 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1b120 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
1b130 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20  Parse, 0,.      
1b140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b150 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
1b160 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20 30 29  ID, &prevCol, 0)
1b170 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
1b180 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
1b190 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1b1a0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
1b1b0 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20  >nExpr==1 );.   
1b1c0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1b1d0 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70 4c 69  SetSortOrder(pLi
1b1e0 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 29 3b 0a  st, sortOrder);.
1b1f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1b200 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
1b210 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c 20  kLength(pParse, 
1b220 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22 29 3b  pList, "index");
1b230 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
1b240 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62  e out how many b
1b250 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72  ytes of space ar
1b260 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  e required to st
1b270 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20  ore explicitly. 
1b280 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f   ** specified co
1b290 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1b2a0 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66   names..  */.  f
1b2b0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1b2c0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1b2d0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
1b2e0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1b2f0 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
1b300 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 69  Expr!=0 );.    i
1b310 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
1b320 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20  _COLLATE ){.    
1b330 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b    nExtra += (1 +
1b340 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1b350 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1b360 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ));.    }.  }.. 
1b370 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61   /* .  ** Alloca
1b380 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72  te the index str
1b390 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20  ucture. .  */.  
1b3a0 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
1b3b0 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
1b3c0 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70 50    nExtraCol = pP
1b3d0 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  k ? pPk->nKeyCol
1b3e0 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d   : 1;.  pIndex =
1b3f0 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65   sqlite3Allocate
1b400 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
1b410 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e  pList->nExpr + n
1b420 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20  ExtraCol,.      
1b430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b450 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b  nName + nExtra +
1b460 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20 20   1, &zExtra);.  
1b470 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1b480 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
1b490 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1b4a0 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
1b4b0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1b4c0 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61  GNMENT(pIndex->a
1b4d0 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20  iRowLogEst) );. 
1b4e0 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
1b4f0 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49  YTE_ALIGNMENT(pI
1b500 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b  ndex->azColl) );
1b510 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
1b520 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78   = zExtra;.  zEx
1b530 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31  tra += nName + 1
1b540 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65  ;.  memcpy(pInde
1b550 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  x->zName, zName,
1b560 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e   nName+1);.  pIn
1b570 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
1b580 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  ab;.  pIndex->on
1b590 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72  Error = (u8)onEr
1b5a0 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75  ror;.  pIndex->u
1b5b0 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45  niqNotNull = onE
1b5c0 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20  rror!=OE_None;. 
1b5d0 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65   pIndex->idxType
1b5e0 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 70 49   = idxType;.  pI
1b5f0 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20  ndex->pSchema = 
1b600 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
1b610 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  hema;.  pIndex->
1b620 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d  nKeyCol = pList-
1b630 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 70 50  >nExpr;.  if( pP
1b640 49 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71  IWhere ){.    sq
1b650 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
1b660 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
1b670 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61 72 74 49  , pTab, NC_PartI
1b680 64 78 2c 20 70 50 49 57 68 65 72 65 2c 20 30 29  dx, pPIWhere, 0)
1b690 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 50  ;.    pIndex->pP
1b6a0 61 72 74 49 64 78 57 68 65 72 65 20 3d 20 70 50  artIdxWhere = pP
1b6b0 49 57 68 65 72 65 3b 0a 20 20 20 20 70 50 49 57  IWhere;.    pPIW
1b6c0 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  here = 0;.  }.  
1b6d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1b6e0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1b6f0 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20  b, iDb, 0) );.. 
1b700 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1b710 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f   if we should ho
1b720 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74  nor DESC request
1b730 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  s on index colum
1b740 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
1b750 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
1b760 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
1b770 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
1b780 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72  = -1;   /* Honor
1b790 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65   DESC */.  }else
1b7a0 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
1b7b0 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  ask = 0;    /* I
1b7c0 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20  gnore DESC */.  
1b7d0 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  }..  /* Analyze 
1b7e0 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
1b7f0 65 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 72  essions that for
1b800 6d 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  m the terms of t
1b810 68 65 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a  he index and.  *
1b820 2a 20 72 65 70 6f 72 74 20 61 6e 79 20 65 72 72  * report any err
1b830 6f 72 73 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d  ors.  In the com
1b840 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
1b850 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1b860 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20   exactly.  ** a 
1b870 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74  table column, st
1b880 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  ore that column 
1b890 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20  in aiColumn[].  
1b8a0 46 6f 72 20 67 65 6e 65 72 61 6c 20 65 78 70 72  For general expr
1b8b0 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f  essions,.  ** po
1b8c0 70 75 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e 61  pulate pIndex->a
1b8d0 43 6f 6c 45 78 70 72 20 61 6e 64 20 73 74 6f 72  ColExpr and stor
1b8e0 65 20 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69  e XN_EXPR (-2) i
1b8f0 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20  n aiColumn[]..  
1b900 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73  **.  ** TODO: Is
1b910 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66  sue a warning if
1b920 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   two or more col
1b930 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
1b940 78 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  x are identical.
1b950 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75  .  ** TODO: Issu
1b960 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74  e a warning if t
1b970 68 65 20 74 61 62 6c 65 20 70 72 69 6d 61 72 79  he table primary
1b980 20 6b 65 79 20 69 73 20 75 73 65 64 20 61 73 20   key is used as 
1b990 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  part of the.  **
1b9a0 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f   index key..  */
1b9b0 0a 20 20 70 4c 69 73 74 49 74 65 6d 20 3d 20 70  .  pListItem = p
1b9c0 4c 69 73 74 2d 3e 61 3b 0a 20 20 69 66 28 20 49  List->a;.  if( I
1b9d0 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
1b9e0 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  ){.    pIndex->a
1b9f0 43 6f 6c 45 78 70 72 20 3d 20 70 4c 69 73 74 3b  ColExpr = pList;
1ba00 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
1ba10 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1ba20 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  <pIndex->nKeyCol
1ba30 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d  ; i++, pListItem
1ba40 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1ba50 43 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  CExpr;          
1ba60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1ba70 2d 74 68 20 69 6e 64 65 78 20 65 78 70 72 65 73  -th index expres
1ba80 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sion */.    int 
1ba90 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
1baa0 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 53  er;        /* AS
1bab0 43 20 6f 72 20 44 45 53 43 20 6f 6e 20 74 68 65  C or DESC on the
1bac0 20 69 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e   i-th expression
1bad0 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
1bae0 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
1baf0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
1bb00 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
1bb10 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65  e */..    sqlite
1bb20 33 53 74 72 69 6e 67 54 6f 49 64 28 70 4c 69 73  3StringToId(pLis
1bb30 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  tItem->pExpr);. 
1bb40 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
1bb50 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
1bb60 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f  Parse, pTab, NC_
1bb70 49 64 78 45 78 70 72 2c 20 70 4c 69 73 74 49 74  IdxExpr, pListIt
1bb80 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20  em->pExpr, 0);. 
1bb90 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
1bba0 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Err ) goto exit_
1bbb0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1bbc0 20 20 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74    pCExpr = sqlit
1bbd0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
1bbe0 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  e(pListItem->pEx
1bbf0 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 45  pr);.    if( pCE
1bc00 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
1bc10 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  MN ){.      if( 
1bc20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e  pTab==pParse->pN
1bc30 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  ewTable ){.     
1bc40 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1bc50 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 72  sg(pParse, "expr
1bc60 65 73 73 69 6f 6e 73 20 70 72 6f 68 69 62 69 74  essions prohibit
1bc70 65 64 20 69 6e 20 50 52 49 4d 41 52 59 20 4b 45  ed in PRIMARY KE
1bc80 59 20 61 6e 64 20 22 0a 20 20 20 20 20 20 20 20  Y and ".        
1bc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bca0 20 20 20 20 20 20 20 20 22 55 4e 49 51 55 45 20          "UNIQUE 
1bcb0 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20  constraints");. 
1bcc0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
1bcd0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1bce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1bcf0 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
1bd00 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
1bd10 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72  pIndex->aColExpr
1bd20 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
1bd30 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20    pList = 0;.   
1bd40 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 58     }.      j = X
1bd50 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49  N_EXPR;.      pI
1bd60 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
1bd70 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20  ] = XN_EXPR;.   
1bd80 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e     pIndex->uniqN
1bd90 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  otNull = 0;.    
1bda0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20 3d  }else{.      j =
1bdb0 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e   pCExpr->iColumn
1bdc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1bdd0 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20 20 20  j<=0x7fff );.   
1bde0 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20     if( j<0 ){.  
1bdf0 20 20 20 20 20 20 6a 20 3d 20 70 54 61 62 2d 3e        j = pTab->
1be00 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c  iPKey;.      }el
1be10 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f  se if( pTab->aCo
1be20 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20  l[j].notNull==0 
1be30 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
1be40 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  x->uniqNotNull =
1be50 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1be60 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
1be70 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a  mn[i] = (i16)j;.
1be80 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20      }.    zColl 
1be90 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  = 0;.    if( pLi
1bea0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f  stItem->pExpr->o
1beb0 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b  p==TK_COLLATE ){
1bec0 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c  .      int nColl
1bed0 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
1bee0 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
1bef0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
1bf00 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    nColl = sqlite
1bf10 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
1bf20 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   + 1;.      asse
1bf30 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c  rt( nExtra>=nCol
1bf40 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  l );.      memcp
1bf50 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c  y(zExtra, zColl,
1bf60 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a   nColl);.      z
1bf70 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Coll = zExtra;. 
1bf80 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e       zExtra += n
1bf90 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74  Coll;.      nExt
1bfa0 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra -= nColl;.   
1bfb0 20 7d 65 6c 73 65 20 69 66 28 20 6a 3e 3d 30 20   }else if( j>=0 
1bfc0 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  ){.      zColl =
1bfd0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
1bfe0 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Coll;.    }.    
1bff0 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f  if( !zColl ) zCo
1c000 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  ll = sqlite3StrB
1c010 49 4e 41 52 59 3b 0a 20 20 20 20 69 66 28 20 21  INARY;.    if( !
1c020 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
1c030 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   !sqlite3LocateC
1c040 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
1c050 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67  Coll) ){.      g
1c060 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1c070 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
1c080 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1c090 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20  i] = zColl;.    
1c0a0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
1c0b0 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  er = pListItem->
1c0c0 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74  sortOrder & sort
1c0d0 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70  OrderMask;.    p
1c0e0 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
1c0f0 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65  r[i] = (u8)reque
1c100 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20  stedSortOrder;. 
1c110 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20   }..  /* Append 
1c120 74 68 65 20 74 61 62 6c 65 20 6b 65 79 20 74 6f  the table key to
1c130 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1c140 69 6e 64 65 78 2e 20 20 46 6f 72 20 57 49 54 48  index.  For WITH
1c150 4f 55 54 20 52 4f 57 49 44 0a 20 20 2a 2a 20 74  OUT ROWID.  ** t
1c160 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 21  ables (when pPk!
1c170 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65  =0) this will be
1c180 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 50 52   the declared PR
1c190 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 0a  IMARY KEY.  For.
1c1a0 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61 62 6c    ** normal tabl
1c1b0 65 73 20 28 77 68 65 6e 20 70 50 6b 3d 3d 30 29  es (when pPk==0)
1c1c0 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   this will be th
1c1d0 65 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20  e rowid..  */.  
1c1e0 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66  if( pPk ){.    f
1c1f0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e  or(j=0; j<pPk->n
1c200 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
1c210 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d      int x = pPk-
1c220 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
1c230 20 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30      assert( x>=0
1c240 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61   );.      if( ha
1c250 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e  sColumn(pIndex->
1c260 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78  aiColumn, pIndex
1c270 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b  ->nKeyCol, x) ){
1c280 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1c290 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20  >nColumn--; .   
1c2a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c2b0 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
1c2c0 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20  mn[i] = x;.     
1c2d0 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c     pIndex->azCol
1c2e0 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f  l[i] = pPk->azCo
1c2f0 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  ll[j];.        p
1c300 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
1c310 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72  r[i] = pPk->aSor
1c320 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
1c330 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     i++;.      }.
1c340 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1c350 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  ( i==pIndex->nCo
1c360 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  lumn );.  }else{
1c370 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
1c380 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f  olumn[i] = XN_RO
1c390 57 49 44 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  WID;.    pIndex-
1c3a0 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c  >azColl[i] = sql
1c3b0 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
1c3c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61   }.  sqlite3Defa
1c3d0 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78  ultRowEst(pIndex
1c3e0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
1c3f0 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 20  >pNewTable==0 ) 
1c400 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64  estimateIndexWid
1c410 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f  th(pIndex);..  /
1c420 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20  * If this index 
1c430 63 6f 6e 74 61 69 6e 73 20 65 76 65 72 79 20 63  contains every c
1c440 6f 6c 75 6d 6e 20 6f 66 20 69 74 73 20 74 61 62  olumn of its tab
1c450 6c 65 2c 20 74 68 65 6e 20 6d 61 72 6b 0a 20 20  le, then mark.  
1c460 2a 2a 20 69 74 20 61 73 20 61 20 63 6f 76 65 72  ** it as a cover
1c470 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61  ing index */.  a
1c480 73 73 65 72 74 28 20 48 61 73 52 6f 77 69 64 28  ssert( HasRowid(
1c490 70 54 61 62 29 20 0a 20 20 20 20 20 20 7c 7c 20  pTab) .      || 
1c4a0 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c  pTab->iPKey<0 ||
1c4b0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
1c4c0 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 20 70 54  Index(pIndex, pT
1c4d0 61 62 2d 3e 69 50 4b 65 79 29 3e 3d 30 20 29 3b  ab->iPKey)>=0 );
1c4e0 0a 20 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75  .  recomputeColu
1c4f0 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 70 49  mnsNotIndexed(pI
1c500 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70 54 62  ndex);.  if( pTb
1c510 6c 4e 61 6d 65 21 3d 30 20 26 26 20 70 49 6e 64  lName!=0 && pInd
1c520 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61  ex->nColumn>=pTa
1c530 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 70  b->nCol ){.    p
1c540 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e  Index->isCoverin
1c550 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a  g = 1;.    for(j
1c560 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
1c570 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
1c580 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  ( j==pTab->iPKey
1c590 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1c5a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
1c5b0 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64  lumnOfIndex(pInd
1c5c0 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e 74 69  ex,j)>=0 ) conti
1c5d0 6e 75 65 3b 0a 20 20 20 20 20 20 70 49 6e 64 65  nue;.      pInde
1c5e0 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20  x->isCovering = 
1c5f0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1c600 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1c610 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70   pTab==pParse->p
1c620 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  NewTable ){.    
1c630 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
1c640 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
1c650 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74  to create an aut
1c660 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20  omatic index as 
1c670 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20  a.    ** result 
1c680 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  of a PRIMARY KEY
1c690 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
1c6a0 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65  e on a column de
1c6b0 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20  finition, or.   
1c6c0 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45   ** a PRIMARY KE
1c6d0 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
1c6e0 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  se following the
1c6f0 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
1c700 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e  ons..    ** i.e.
1c710 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a   one of:.    **.
1c720 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
1c730 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20  BLE t(x PRIMARY 
1c740 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20  KEY, y);.    ** 
1c750 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
1c760 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79  , y, UNIQUE(x, y
1c770 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ));.    **.    *
1c780 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68  * Either way, ch
1c790 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
1c7a0 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
1c7b0 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65  has such an inde
1c7c0 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c  x. If.    ** so,
1c7d0 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72   don't bother cr
1c7e0 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e  eating this one.
1c7f0 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69   This only appli
1c800 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74  es to.    ** aut
1c810 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
1c820 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72  ed indices. User
1c830 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79  s can do as they
1c840 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a   wish with.    *
1c850 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63  * explicit indic
1c860 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es..    **.    *
1c870 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20  * Two UNIQUE or 
1c880 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
1c890 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73  traints are cons
1c8a0 69 64 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e  idered equivalen
1c8b0 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68  t.    ** (and th
1c8c0 75 73 20 73 75 70 70 72 65 73 73 69 6e 67 20 74  us suppressing t
1c8d0 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65  he second one) e
1c8e0 76 65 6e 20 69 66 20 74 68 65 79 20 68 61 76 65  ven if they have
1c8f0 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a   different.    *
1c900 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20  * sort orders.. 
1c910 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
1c920 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
1c930 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ent collating se
1c940 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68  quences or if th
1c950 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20  e columns of.   
1c960 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69   ** the constrai
1c970 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66  nt occur in diff
1c980 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68  erent orders, th
1c990 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  en the constrain
1c9a0 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f  ts are.    ** co
1c9b0 6e 73 69 64 65 72 65 64 20 64 69 73 74 69 6e 63  nsidered distinc
1c9c0 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c  t and both resul
1c9d0 74 20 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e  t in separate in
1c9e0 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  dices..    */.  
1c9f0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
1ca00 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
1ca10 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
1ca20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
1ca30 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  ){.      int k;.
1ca40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73        assert( Is
1ca50 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
1ca60 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1ca70 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65  t( pIdx->idxType
1ca80 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  !=SQLITE_IDXTYPE
1ca90 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20  _APPDEF );.     
1caa0 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75   assert( IsUniqu
1cab0 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29  eIndex(pIndex) )
1cac0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  ;..      if( pId
1cad0 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64  x->nKeyCol!=pInd
1cae0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f  ex->nKeyCol ) co
1caf0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
1cb00 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e  r(k=0; k<pIdx->n
1cb10 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20  KeyCol; k++){.  
1cb20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1cb30 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f   *z1;.        co
1cb40 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20  nst char *z2;.  
1cb50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1cb60 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e  dx->aiColumn[k]>
1cb70 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
1cb80 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
1cb90 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43  [k]!=pIndex->aiC
1cba0 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b  olumn[k] ) break
1cbb0 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70  ;.        z1 = p
1cbc0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  Idx->azColl[k];.
1cbd0 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e          z2 = pIn
1cbe0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  dex->azColl[k];.
1cbf0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1cc00 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
1cc10 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  2) ) break;.    
1cc20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
1cc30 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
1cc40 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
1cc50 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e  dx->onError!=pIn
1cc60 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a  dex->onError ){.
1cc70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
1cc80 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65  s constraint cre
1cc90 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e  ates the same in
1cca0 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75  dex as a previou
1ccb0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
1ccc0 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66  onstraint specif
1ccd0 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e  ied somewhere in
1cce0 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
1ccf0 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  E statement..   
1cd00 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
1cd10 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  r the ON CONFLIC
1cd20 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69  T clauses are di
1cd30 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68  fferent. If both
1cd40 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
1cd50 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   ** constraint a
1cd60 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
1cd70 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74  equivalent const
1cd80 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69  raint have expli
1cd90 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  cit.          **
1cda0 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1cdb0 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20  uses this is an 
1cdc0 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
1cdd0 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  , use the.      
1cde0 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c      ** explicitl
1cdf0 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61  y specified beha
1ce00 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  vior for the ind
1ce10 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ex..          */
1ce20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1ce30 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  (pIdx->onError==
1ce40 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49  OE_Default || pI
1ce50 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
1ce60 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20  E_Default) ){.  
1ce70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1ce80 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1ce90 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1cea0 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20     "conflicting 
1ceb0 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
1cec0 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20  ses specified", 
1ced0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
1cee0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
1cef0 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
1cf00 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
1cf10 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45         pIdx->onE
1cf20 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  rror = pIndex->o
1cf30 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  nError;.        
1cf40 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1cf50 20 20 20 20 20 20 69 66 28 20 69 64 78 54 79 70        if( idxTyp
1cf60 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e==SQLITE_IDXTYP
1cf70 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 20 70  E_PRIMARYKEY ) p
1cf80 49 64 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69  Idx->idxType = i
1cf90 64 78 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  dxType;.        
1cfa0 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
1cfb0 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  JECT ){.        
1cfc0 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
1cfd0 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e  = pParse->pNewIn
1cfe0 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70  dex;.          p
1cff0 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78  Parse->pNewIndex
1d000 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 20   = pIndex;.     
1d010 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b       pIndex = 0;
1d020 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d030 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1d040 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
1d050 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1d060 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f  if( !IN_RENAME_O
1d070 42 4a 45 43 54 20 29 7b 0a 0a 20 20 20 20 2f 2a  BJECT ){..    /*
1d080 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e   Link the new In
1d090 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f  dex structure to
1d0a0 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74   its table and t
1d0b0 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20 20  o the other.    
1d0c0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
1d0d0 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
1d0e0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  . .    */.    as
1d0f0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
1d100 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  rr==0 );.    if(
1d110 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
1d120 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
1d130 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d140 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53  !IN_SPECIAL_PARS
1d150 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
1d160 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
1d170 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
1d180 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
1d190 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
1d1a0 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
1d1b0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e        pIndex->tn
1d1c0 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
1d1d0 77 54 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 69  wTnum;.        i
1d1e0 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 48  f( sqlite3IndexH
1d1f0 61 73 44 75 70 6c 69 63 61 74 65 52 6f 6f 74 50  asDuplicateRootP
1d200 61 67 65 28 70 49 6e 64 65 78 29 20 29 7b 0a 20  age(pIndex) ){. 
1d210 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d220 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1d230 20 22 69 6e 76 61 6c 69 64 20 72 6f 6f 74 70 61   "invalid rootpa
1d240 67 65 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge");.          
1d250 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
1d260 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1d270 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
1d280 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1d290 65 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ex;.        }.  
1d2a0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 20 3d 20      }.      p = 
1d2b0 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
1d2c0 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  t(&pIndex->pSche
1d2d0 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20  ma->idxHash, .  
1d2e0 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1d2f0 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a  zName, pIndex);.
1d300 20 20 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20        if( p ){. 
1d310 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1d320 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20  ==pIndex );  /* 
1d330 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
1d340 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
1d350 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
1d360 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  lt(db);.        
1d370 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1d380 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
1d390 20 20 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61        db->mDbFla
1d3a0 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68  gs |= DBFLAG_Sch
1d3b0 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 20 20 7d  emaChange;.    }
1d3c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1d3d0 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
1d3e0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1d3f0 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54  tement (or CREAT
1d400 45 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20  E TABLE if the. 
1d410 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61     ** index is a
1d420 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20  n implied index 
1d430 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20  for a UNIQUE or 
1d440 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
1d450 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 20  traint) then.   
1d460 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f   ** emit code to
1d470 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   allocate the in
1d480 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20  dex rootpage on 
1d490 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e  disk and make an
1d4a0 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 2a   entry for.    *
1d4b0 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74  * the index in t
1d4c0 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
1d4d0 20 74 61 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c   table and popul
1d4e0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 77 69  ate the index wi
1d4f0 74 68 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e  th.    ** conten
1d500 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20  t.  But, do not 
1d510 64 6f 20 74 68 69 73 20 69 66 20 77 65 20 61 72  do this if we ar
1d520 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69 6e 67  e simply reading
1d530 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
1d540 65 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  er.    ** table 
1d550 74 6f 20 70 61 72 73 65 20 74 68 65 20 73 63 68  to parse the sch
1d560 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20  ema, or if this 
1d570 69 6e 64 65 78 20 69 73 20 74 68 65 20 50 52 49  index is the PRI
1d580 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20  MARY KEY index. 
1d590 20 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f     ** of a WITHO
1d5a0 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a  UT ROWID table..
1d5b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
1d5c0 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20   pTblName==0 it 
1d5d0 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
1d5e0 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
1d5f0 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d   an implied PRIM
1d600 41 52 59 20 4b 45 59 0a 20 20 20 20 2a 2a 20 6f  ARY KEY.    ** o
1d610 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69  r UNIQUE index i
1d620 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
1d630 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
1d640 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  ce the table.   
1d650 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
1d660 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
1d670 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
1d680 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
1d690 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20  tialization.    
1d6a0 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73  ** step can be s
1d6b0 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  kipped..    */. 
1d6c0 20 20 20 65 6c 73 65 20 69 66 28 20 48 61 73 52     else if( HasR
1d6d0 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 70 54  owid(pTab) || pT
1d6e0 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
1d6f0 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
1d700 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
1d710 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20       int iMem = 
1d720 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1d730 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74  .      v = sqlit
1d740 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1d750 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76 3d 3d  );.      if( v==
1d760 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
1d770 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20  eate_index;..   
1d780 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1d790 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1d7a0 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
1d7b0 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
1d7c0 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
1d7d0 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67   the index using
1d7e0 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20 42 75   CreateIndex. Bu
1d7f0 74 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a  t before.      *
1d800 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65  * doing so, code
1d810 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74   a Noop instruct
1d820 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 69 74  ion and store it
1d830 73 20 61 64 64 72 65 73 73 20 69 6e 20 0a 20 20  s address in .  
1d840 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75      ** Index.tnu
1d850 6d 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  m. This is requi
1d860 72 65 64 20 69 6e 20 63 61 73 65 20 74 68 69 73  red in case this
1d870 20 69 6e 64 65 78 20 69 73 20 61 63 74 75 61 6c   index is actual
1d880 6c 79 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 50  ly a .      ** P
1d890 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 74  RIMARY KEY and t
1d8a0 68 65 20 74 61 62 6c 65 20 69 73 20 61 63 74 75  he table is actu
1d8b0 61 6c 6c 79 20 61 20 57 49 54 48 4f 55 54 20 52  ally a WITHOUT R
1d8c0 4f 57 49 44 20 74 61 62 6c 65 2e 20 49 6e 20 0a  OWID table. In .
1d8d0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61        ** that ca
1d8e0 73 65 20 74 68 65 20 63 6f 6e 76 65 72 74 54 6f  se the convertTo
1d8f0 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
1d900 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  e() routine will
1d910 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20 2a   replace.      *
1d920 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74 68 20  * the Noop with 
1d930 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 6f  a Goto to jump o
1d940 76 65 72 20 74 68 65 20 56 44 42 45 20 63 6f 64  ver the VDBE cod
1d950 65 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c 6f  e generated belo
1d960 77 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e 64  w. */.      pInd
1d970 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74  ex->tnum = sqlit
1d980 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
1d990 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 20 20  OP_Noop);.      
1d9a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d9b0 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74  3(v, OP_CreateBt
1d9c0 72 65 65 2c 20 69 44 62 2c 20 69 4d 65 6d 2c 20  ree, iDb, iMem, 
1d9d0 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a  BTREE_BLOBKEY);.
1d9e0 0a 20 20 20 20 20 20 2f 2a 20 47 61 74 68 65 72  .      /* Gather
1d9f0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
1da00 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
1da10 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1da20 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74   into.      ** t
1da30 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c  he zStmt variabl
1da40 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  e.      */.     
1da50 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
1da60 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28         int n = (
1da70 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61  int)(pParse->sLa
1da80 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d  stToken.z - pNam
1da90 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e  e->z) + pParse->
1daa0 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20  sLastToken.n;.  
1dab0 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d        if( pName-
1dac0 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e  >z[n-1]==';' ) n
1dad0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  --;.        /* A
1dae0 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74   named index wit
1daf0 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52  h an explicit CR
1db00 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1db10 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ment */.        
1db20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
1db30 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41  Printf(db, "CREA
1db40 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22  TE%s INDEX %.*s"
1db50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e  ,.            on
1db60 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f  Error==OE_None ?
1db70 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c   "" : " UNIQUE",
1db80 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20   n, pName->z);. 
1db90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1dba0 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61      /* An automa
1dbb0 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65  tic index create
1dbc0 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b  d by a PRIMARY K
1dbd0 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  EY or UNIQUE con
1dbe0 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
1dbf0 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71     /* zStmt = sq
1dc00 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29  lite3MPrintf("")
1dc10 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 74  ; */.        zSt
1dc20 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  mt = 0;.      }.
1dc30 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 6e  .      /* Add an
1dc40 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65   entry in sqlite
1dc50 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73  _master for this
1dc60 20 69 6e 64 65 78 0a 20 20 20 20 20 20 2a 2f 0a   index.      */.
1dc70 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
1dc80 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
1dc90 20 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53   .          "INS
1dca0 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56  ERT INTO %Q.%s V
1dcb0 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51  ALUES('index',%Q
1dcc0 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20  ,%Q,#%d,%Q);",. 
1dcd0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62           db->aDb
1dce0 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
1dcf0 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20  MASTER_NAME,.   
1dd00 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
1dd10 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
1dd20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
1dd30 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20         iMem,.   
1dd40 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20         zStmt.   
1dd50 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1dd60 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1dd70 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20  , zStmt);..     
1dd80 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64   /* Fill the ind
1dd90 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64  ex with data and
1dda0 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68   reparse the sch
1ddb0 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f  ema. Code an OP_
1ddc0 45 78 70 69 72 65 0a 20 20 20 20 20 20 2a 2a 20  Expire.      ** 
1ddd0 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  to invalidate al
1dde0 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73  l pre-compiled s
1ddf0 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20  tatements..     
1de00 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54   */.      if( pT
1de10 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
1de20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
1de30 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
1de40 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
1de50 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
1de60 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
1de70 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
1de80 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
1de90 65 53 63 68 65 6d 61 4f 70 28 70 50 61 72 73 65  eSchemaOp(pParse
1dea0 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
1deb0 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
1dec0 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27  f(db, "name='%q'
1ded0 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78   AND type='index
1dee0 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  '", pIndex->zNam
1def0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e));.        sql
1df00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1df10 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c 20  , OP_Expire, 0, 
1df20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
1df30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1df40 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 64 65 78  mpHere(v, pIndex
1df50 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 7d 0a 20  ->tnum);.    }. 
1df60 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
1df70 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
1df80 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
1df90 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
1dfa0 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
1dfb0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
1dfc0 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
1dfd0 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
1dfe0 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
1dff0 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
1e000 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
1e010 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
1e020 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b  constraint check
1e030 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  .  ** processing
1e040 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65   (in sqlite3Gene
1e050 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68  rateConstraintCh
1e060 65 63 6b 73 28 29 29 20 61 73 20 70 61 72 74 20  ecks()) as part 
1e070 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61  of.  ** UPDATE a
1e080 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  nd INSERT statem
1e090 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69  ents.  .  */.  i
1e0a0 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1e0b0 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   || pTblName==0 
1e0c0 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72  ){.    if( onErr
1e0d0 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c  or!=OE_Replace |
1e0e0 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d  | pTab->pIndex==
1e0f0 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54  0.         || pT
1e100 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ab->pIndex->onEr
1e110 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29  ror==OE_Replace)
1e120 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
1e130 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49  pNext = pTab->pI
1e140 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62  ndex;.      pTab
1e150 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
1e160 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  x;.    }else{.  
1e170 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65      Index *pOthe
1e180 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  r = pTab->pIndex
1e190 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
1e1a0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20  Other->pNext && 
1e1b0 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f  pOther->pNext->o
1e1c0 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
1e1d0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  ce ){.        pO
1e1e0 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70  ther = pOther->p
1e1f0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
1e200 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
1e210 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  t = pOther->pNex
1e220 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d  t;.      pOther-
1e230 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b  >pNext = pIndex;
1e240 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
1e250 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73  x = 0;.  }.  els
1e260 65 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f  e if( IN_RENAME_
1e270 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 61 73  OBJECT ){.    as
1e280 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e  sert( pParse->pN
1e290 65 77 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20  ewIndex==0 );.  
1e2a0 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e    pParse->pNewIn
1e2b0 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
1e2c0 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
1e2d0 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
1e2e0 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
1e2f0 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69  */.exit_create_i
1e300 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64  ndex:.  if( pInd
1e310 65 78 20 29 20 73 71 6c 69 74 65 33 46 72 65 65  ex ) sqlite3Free
1e320 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1e330 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1e340 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68  Delete(db, pPIWh
1e350 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ere);.  sqlite3E
1e360 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
1e370 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  , pList);.  sqli
1e380 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1e390 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  (db, pTblName);.
1e3a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1e3b0 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, zName);.}../
1e3c0 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e  *.** Fill the In
1e3d0 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61  dex.aiRowEst[] a
1e3e0 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c  rray with defaul
1e3f0 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  t information - 
1e400 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74  information.** t
1e410 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77  o be used when w
1e420 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74  e have not run t
1e430 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
1e440 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45  nd..**.** aiRowE
1e450 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65  st[0] is suppose
1e460 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
1e470 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
1e480 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
1e490 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f  ..** Since we do
1e4a0 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73   not know, guess
1e4b0 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52   1 million.  aiR
1e4c0 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65  owEst[1] is an e
1e4d0 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a  stimate of the.*
1e4e0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
1e4f0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
1e500 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72  at match any par
1e510 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66  ticular value of
1e520 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f   the.** first co
1e530 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
1e540 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20  x.  aiRowEst[2] 
1e550 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
1e560 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  f the number.** 
1e570 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74  of rows that mat
1e580 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
1e590 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  r combination of
1e5a0 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c   the first 2 col
1e5b0 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69  umns.** of the i
1e5c0 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f  ndex.  And so fo
1e5d0 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c  rth.  It must al
1e5e0 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65  ways be the case
1e5f0 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20   that.*.**      
1e600 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
1e610 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a  <=aiRowEst[N-1].
1e620 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
1e630 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a  owEst[N]>=1.**.*
1e640 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61  * Apart from tha
1e650 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c  t, we have littl
1e660 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64  e to go on besid
1e670 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20  es intuition as 
1e680 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45  to.** how aiRowE
1e690 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69  st[] should be i
1e6a0 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65  nitialized.  The
1e6b0 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74   numbers generat
1e6c0 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62  ed here.** are b
1e6d0 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20  ased on typical 
1e6e0 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20  values found in 
1e6f0 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a  actual indices..
1e700 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
1e710 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64  efaultRowEst(Ind
1e720 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20  ex *pIdx){.  /* 
1e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
1e740 30 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20  0,  9,  8,  7,  
1e750 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56  6 */.  LogEst aV
1e760 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c  al[] = { 33, 32,
1e770 20 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20   30, 28, 26 };. 
1e780 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64   LogEst *a = pId
1e790 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a  x->aiRowLogEst;.
1e7a0 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49    int nCopy = MI
1e7b0 4e 28 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c  N(ArraySize(aVal
1e7c0 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  ), pIdx->nKeyCol
1e7d0 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  );.  int i;..  /
1e7e0 2a 20 49 6e 64 65 78 65 73 20 77 69 74 68 20 64  * Indexes with d
1e7f0 65 66 61 75 6c 74 20 72 6f 77 20 65 73 74 69 6d  efault row estim
1e800 61 74 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ates should not 
1e810 68 61 76 65 20 73 74 61 74 31 20 64 61 74 61 20  have stat1 data 
1e820 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 49  */.  assert( !pI
1e830 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29 3b 0a  dx->hasStat1 );.
1e840 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69  .  /* Set the fi
1e850 72 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65  rst entry (numbe
1e860 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
1e870 20 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65   index) to the e
1e880 73 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e  stimated .  ** n
1e890 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1e8a0 20 74 68 65 20 74 61 62 6c 65 2c 20 6f 72 20 68   the table, or h
1e8b0 61 6c 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  alf the number o
1e8c0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
1e8d0 62 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70  ble.  ** for a p
1e8e0 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 20 20 20  artial index.   
1e8f0 42 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74  But do not let t
1e900 68 65 20 65 73 74 69 6d 61 74 65 20 64 72 6f 70  he estimate drop
1e910 20 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20   below 10. */.  
1e920 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61  a[0] = pIdx->pTa
1e930 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  ble->nRowLogEst;
1e940 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61  .  if( pIdx->pPa
1e950 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20  rtIdxWhere!=0 ) 
1e960 61 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73  a[0] -= 10;  ass
1e970 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
1e980 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 69  LogEst(2) );.  i
1e990 66 28 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30  f( a[0]<33 ) a[0
1e9a0 5d 20 3d 20 33 33 3b 20 20 20 20 20 20 20 20 20  ] = 33;         
1e9b0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1e9c0 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
1e9d0 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  st(10) );..  /* 
1e9e0 45 73 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b  Estimate that a[
1e9f0 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69  1] is 10, a[2] i
1ea00 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20  s 9, a[3] is 8, 
1ea10 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20  a[4] is 7, a[5] 
1ea20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61  is.  ** 6 and ea
1ea30 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 76 61  ch subsequent va
1ea40 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69 73 20  lue (if any) is 
1ea50 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  5.  */.  memcpy(
1ea60 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f  &a[1], aVal, nCo
1ea70 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  py*sizeof(LogEst
1ea80 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70  ));.  for(i=nCop
1ea90 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b  y+1; i<=pIdx->nK
1eaa0 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
1eab0 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20   a[i] = 23;     
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1ead0 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74  ssert( 23==sqlit
1eae0 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20  e3LogEst(5) );. 
1eaf0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d   }..  assert( 0=
1eb00 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
1eb10 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69  ) );.  if( IsUni
1eb20 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29  queIndex(pIdx) )
1eb30 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   a[pIdx->nKeyCol
1eb40 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
1eb50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
1eb60 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
1eb70 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
1eb80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1eb90 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
1eba0 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
1ebb0 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
1ebc0 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50  lite3DropIndex(P
1ebd0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1ebe0 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
1ebf0 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49  t ifExists){.  I
1ec00 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
1ec10 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
1ec20 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1ec30 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
1ec40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1ec50 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20  e->nErr==0 );   
1ec60 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20  /* Never called 
1ec70 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72  with prior error
1ec80 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d  s */.  if( db->m
1ec90 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1eca0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1ecb0 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61  p_index;.  }.  a
1ecc0 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
1ecd0 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53  rc==1 );.  if( S
1ece0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
1ecf0 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
1ed00 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  se) ){.    goto 
1ed10 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1ed20 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
1ed30 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
1ed40 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  (db, pName->a[0]
1ed50 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
1ed60 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
1ed70 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
1ed80 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78  ){.    if( !ifEx
1ed90 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71  ists ){.      sq
1eda0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1edb0 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
1edc0 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65  ndex: %S", pName
1edd0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1ede0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1edf0 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
1ee00 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ema(pParse, pNam
1ee10 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
1ee20 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  e);.    }.    pP
1ee30 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
1ee40 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
1ee50 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1ee60 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
1ee70 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49  x->idxType!=SQLI
1ee80 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45  TE_IDXTYPE_APPDE
1ee90 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  F ){.    sqlite3
1eea0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1eeb0 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
1eec0 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
1eed0 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
1eee0 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1eef0 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
1ef00 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ped", 0);.    go
1ef10 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1ef20 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  ex;.  }.  iDb = 
1ef30 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
1ef40 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d  ndex(db, pIndex-
1ef50 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c  >pSchema);.  sql
1ef60 69 74 65 33 53 63 68 65 6d 61 57 72 69 74 61 62  ite3SchemaWritab
1ef70 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
1ef80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ef90 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
1efa0 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
1efb0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
1efc0 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
1efd0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
1efe0 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
1eff0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
1f000 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
1f010 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  bSName;.    cons
1f020 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
1f030 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
1f040 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1f050 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1f060 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
1f070 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20  , zTab, 0, zDb) 
1f080 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
1f090 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1f0a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d     }.    if( !OM
1f0b0 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
1f0c0 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45   ) code = SQLITE
1f0d0 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  _DROP_TEMP_INDEX
1f0e0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1f0f0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1f100 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d  e, code, pIndex-
1f110 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  >zName, pTab->zN
1f120 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
1f130 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1f140 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
1f150 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1f160 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1f170 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65   remove the inde
1f180 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d  x and from the m
1f190 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  aster table */. 
1f1a0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1f1b0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1f1c0 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
1f1d0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1f1e0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
1f1f0 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
1f200 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
1f210 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44  Parse,.       "D
1f220 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
1f230 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20 41   WHERE name=%Q A
1f240 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22  ND type='index'"
1f250 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ,.       db->aDb
1f260 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
1f270 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70 49 6e  MASTER_NAME, pIn
1f280 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  dex->zName.    )
1f290 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65  ;.    sqlite3Cle
1f2a0 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61  arStatTables(pPa
1f2b0 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c  rse, iDb, "idx",
1f2c0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b   pIndex->zName);
1f2d0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
1f2e0 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
1f2f0 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72   iDb);.    destr
1f300 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
1f310 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  e, pIndex->tnum,
1f320 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
1f330 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1f340 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44  OP_DropIndex, iD
1f350 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d  b, 0, 0, pIndex-
1f360 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
1f370 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78  .exit_drop_index
1f380 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
1f390 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
1f3a0 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41  me);.}../*.** pA
1f3b0 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65  rray is a pointe
1f3c0 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  r to an array of
1f3d0 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68 20 6f   objects. Each o
1f3e0 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20  bject in the.** 
1f3f0 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79  array is szEntry
1f400 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
1f410 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65  This routine use
1f420 73 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  s sqlite3DbReall
1f430 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e  oc().** to exten
1f440 64 20 74 68 65 20 61 72 72 61 79 20 73 6f 20 74  d the array so t
1f450 68 61 74 20 74 68 65 72 65 20 69 73 20 73 70 61  hat there is spa
1f460 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a  ce for a new obj
1f470 65 63 74 20 61 74 20 74 68 65 20 65 6e 64 2e 0a  ect at the end..
1f480 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1f490 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1f4a0 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e  ed, *pnEntry con
1f4b0 74 61 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e  tains the curren
1f4c0 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65  t size of.** the
1f4d0 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74 72 69   array (in entri
1f4e0 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f  es - so the allo
1f4f0 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45  cation is ((*pnE
1f500 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72 79 29  ntry) * szEntry)
1f510 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74   bytes.** in tot
1f520 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
1f530 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73 20 73  e realloc() is s
1f540 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65 2e 20  uccessful (i.e. 
1f550 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74  if no OOM condit
1f560 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74 68 65  ion occurs), the
1f570 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  .** space alloca
1f580 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ted for the new 
1f590 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f 65 64  object is zeroed
1f5a0 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64 61 74  , *pnEntry updat
1f5b0 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74  ed to.** reflect
1f5c0 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66   the new size of
1f5d0 20 74 68 65 20 61 72 72 61 79 20 61 6e 64 20 61   the array and a
1f5e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1f5f0 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  new allocation.*
1f600 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70 49 64  * returned. *pId
1f610 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
1f620 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77  index of the new
1f630 20 61 72 72 61 79 20 65 6e 74 72 79 20 69 6e 20   array entry in 
1f640 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
1f650 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1f660 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66 61 69  he realloc() fai
1f670 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73 65 74  ls, *pIdx is set
1f680 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79   to -1, *pnEntry
1f690 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68   remains.** unch
1f6a0 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f 70 79  anged and a copy
1f6b0 20 6f 66 20 70 41 72 72 61 79 20 72 65 74 75 72   of pArray retur
1f6c0 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ned..*/.void *sq
1f6d0 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1f6e0 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
1f6f0 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  b,      /* Conne
1f700 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
1f710 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
1f720 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  es */.  void *pA
1f730 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72  rray,     /* Arr
1f740 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
1f750 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63  Might be realloc
1f760 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ated */.  int sz
1f770 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53  Entry,      /* S
1f780 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65  ize of each obje
1f790 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ct in the array 
1f7a0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72  */.  int *pnEntr
1f7b0 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  y,     /* Number
1f7c0 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72   of objects curr
1f7d0 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a  ently in use */.
1f7e0 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20    int *pIdx     
1f7f0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1f800 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20   index of a new 
1f810 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  slot here */.){.
1f820 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74    char *z;.  int
1f830 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20   n = *pnEntry;. 
1f840 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29   if( (n & (n-1))
1f850 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  ==0 ){.    int s
1f860 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a  z = (n==0) ? 1 :
1f870 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a   2*n;.    void *
1f880 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
1f890 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72  Realloc(db, pArr
1f8a0 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b  ay, sz*szEntry);
1f8b0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
1f8c0 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   ){.      *pIdx 
1f8d0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
1f8e0 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d  rn pArray;.    }
1f8f0 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e  .    pArray = pN
1f900 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63  ew;.  }.  z = (c
1f910 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d  har*)pArray;.  m
1f920 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45  emset(&z[n * szE
1f930 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72  ntry], 0, szEntr
1f940 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b  y);.  *pIdx = n;
1f950 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20  .  ++*pnEntry;. 
1f960 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
1f970 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
1f980 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
1f990 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
1f9a0 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
1f9b0 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
1f9c0 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
1f9d0 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
1f9e0 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
1f9f0 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
1fa00 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
1fa10 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
1fa20 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1fa30 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  IdList *pList, T
1fa40 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
1fa50 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1fa60 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
1fa70 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1fa80 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
1fa90 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1faa0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
1fab0 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  (IdList) );.    
1fac0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1fad0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1fae0 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65  List->a = sqlite
1faf0 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
1fb00 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
1fb10 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20  pList->a,.      
1fb20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
1fb30 30 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c 69 73  0]),.      &pLis
1fb40 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 69  t->nId,.      &i
1fb50 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20  .  );.  if( i<0 
1fb60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  ){.    sqlite3Id
1fb70 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1fb80 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72  List);.    retur
1fb90 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
1fba0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
1fbb0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1fbc0 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
1fbd0 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45  .  if( IN_RENAME
1fbe0 5f 4f 42 4a 45 43 54 20 26 26 20 70 4c 69 73 74  _OBJECT && pList
1fbf0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
1fc00 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
1fc10 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65  eTokenMap(pParse
1fc20 2c 20 28 76 6f 69 64 2a 29 70 4c 69 73 74 2d 3e  , (void*)pList->
1fc30 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 6b  a[i].zName, pTok
1fc40 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  en);.  }.  retur
1fc50 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
1fc60 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69  * Delete an IdLi
1fc70 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
1fc80 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
1fc90 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
1fca0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
1fcb0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1fcc0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1fcd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1fce0 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
1fcf0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1fd00 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
1fd10 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
1fd20 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1fd30 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
1fd40 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
1fd50 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
1fd60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
1fd70 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
1fd80 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
1fd90 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
1fda0 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
1fdb0 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
1fdc0 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
1fdd0 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
1fde0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
1fdf0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1fe00 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1fe10 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
1fe20 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
1fe30 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
1fe40 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
1fe50 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
1fe60 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
1fe70 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
1fe80 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
1fe90 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  Maximum size of 
1fea0 61 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74  a SrcList object
1feb0 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74  ..** The SrcList
1fec0 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65 64 20   object is used 
1fed0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  to represent the
1fee0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1fef0 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
1ff00 65 6d 65 6e 74 2c 20 61 6e 64 20 74 68 65 20 71  ement, and the q
1ff10 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 63 61 6e  uery planner can
1ff20 6e 6f 74 20 64 65 61 6c 20 77 69 74 68 20 6d 6f  not deal with mo
1ff30 72 65 0a 2a 2a 20 74 68 61 6e 20 36 34 20 74 61  re.** than 64 ta
1ff40 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 2e 20  bles in a join. 
1ff50 20 53 6f 20 61 6e 79 20 76 61 6c 75 65 20 6c 61   So any value la
1ff60 72 67 65 72 20 74 68 61 6e 20 36 34 20 68 65 72  rger than 64 her
1ff70 65 0a 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65  e.** is sufficie
1ff80 6e 74 20 66 6f 72 20 6d 6f 73 74 20 75 73 65 73  nt for most uses
1ff90 2e 20 20 53 6d 61 6c 6c 65 72 20 76 61 6c 75 65  .  Smaller value
1ffa0 73 2c 20 6c 69 6b 65 20 73 61 79 20 31 30 2c 20  s, like say 10, 
1ffb0 61 72 65 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61  are.** appropria
1ffc0 74 65 20 66 6f 72 20 73 6d 61 6c 6c 20 61 6e 64  te for small and
1ffd0 20 6d 65 6d 6f 72 79 2d 6c 69 6d 69 74 65 64 20   memory-limited 
1ffe0 61 70 70 6c 69 63 61 74 69 6f 6e 73 2e 0a 2a 2f  applications..*/
1fff0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20000 4d 41 58 5f 53 52 43 4c 49 53 54 0a 23 20 64 65  MAX_SRCLIST.# de
20010 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f  fine SQLITE_MAX_
20020 53 52 43 4c 49 53 54 20 32 30 30 0a 23 65 6e 64  SRCLIST 200.#end
20030 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64  if../*.** Expand
20040 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
20050 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76  ated for the giv
20060 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63  en SrcList objec
20070 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67  t by.** creating
20080 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74   nExtra new slot
20090 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69  s beginning at i
200a0 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69  Start.  iStart i
200b0 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a  s zero based..**
200c0 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a   New slots are z
200d0 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  eroed..**.** For
200e0 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73   example, suppos
200f0 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74  e a SrcList init
20100 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74  ially contains t
20110 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e  wo entries: A,B.
20120 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20  .** To append 3 
20130 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f  new entries onto
20140 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69   the end, do thi
20150 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69  s:.**.**    sqli
20160 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
20170 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20  e(db, pSrclist, 
20180 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74  3, 2);.**.** Aft
20190 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  er the call abov
201a0 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61  e it would conta
201b0 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20  in:  A, B, nil, 
201c0 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20  nil, nil..** If 
201d0 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d  the iStart argum
201e0 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69  ent had been 1 i
201f0 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65  nstead of 2, the
20200 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  n the result.** 
20210 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a  would have been:
20220 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e    A, nil, nil, n
20230 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65  il, B.  To prepe
20240 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73  nd the new slots
20250 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20  ,.** the iStart 
20260 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30  value would be 0
20270 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68  .  The result th
20280 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20  en would.** be: 
20290 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41  nil, nil, nil, A
202a0 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  , B..**.** If a 
202b0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
202c0 6e 20 66 61 69 6c 73 20 6f 72 20 74 68 65 20 53  n fails or the S
202d0 72 63 4c 69 73 74 20 62 65 63 6f 6d 65 73 20 74  rcList becomes t
202e0 6f 6f 20 6c 61 72 67 65 2c 20 6c 65 61 76 65 0a  oo large, leave.
202f0 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
20300 53 72 63 4c 69 73 74 20 75 6e 63 68 61 6e 67 65  SrcList unchange
20310 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2c 20  d, return NULL, 
20320 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72  and leave an err
20330 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e  or message.** in
20340 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 53 72 63 4c   pParse..*/.SrcL
20350 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
20360 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 50 61  istEnlarge(.  Pa
20370 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
20380 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
20390 65 78 74 20 69 6e 74 6f 20 77 68 69 63 68 20 65  ext into which e
203a0 72 72 6f 72 73 20 61 72 65 20 72 65 70 6f 72 74  rrors are report
203b0 65 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ed */.  SrcList 
203c0 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68  *pSrc,     /* Th
203d0 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20  e SrcList to be 
203e0 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e  enlarged */.  in
203f0 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
20400 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
20410 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74  w slots to add t
20420 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20  o pSrc->a[] */. 
20430 20 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20   int iStart     
20440 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
20450 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72  pSrc->a[] of fir
20460 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29  st new slot */.)
20470 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
20480 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
20490 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61   on calling para
204a0 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65  meters */.  asse
204b0 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b  rt( iStart>=0 );
204c0 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72  .  assert( nExtr
204d0 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  a>=1 );.  assert
204e0 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61  ( pSrc!=0 );.  a
204f0 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70  ssert( iStart<=p
20500 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20  Src->nSrc );..  
20510 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69  /* Allocate addi
20520 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20  tional space if 
20530 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20  needed */.  if( 
20540 28 75 33 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b  (u32)pSrc->nSrc+
20550 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c  nExtra>pSrc->nAl
20560 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  loc ){.    SrcLi
20570 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e  st *pNew;.    in
20580 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d  t nAlloc = pSrc-
20590 3e 6e 53 72 63 2a 32 2b 6e 45 78 74 72 61 3b 0a  >nSrc*2+nExtra;.
205a0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
205b0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
205c0 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72     if( pSrc->nSr
205d0 63 2b 6e 45 78 74 72 61 3e 3d 53 51 4c 49 54 45  c+nExtra>=SQLITE
205e0 5f 4d 41 58 5f 53 52 43 4c 49 53 54 20 29 7b 0a  _MAX_SRCLIST ){.
205f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
20600 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
20610 6f 6f 20 6d 61 6e 79 20 46 52 4f 4d 20 63 6c 61  oo many FROM cla
20620 75 73 65 20 74 65 72 6d 73 2c 20 6d 61 78 3a 20  use terms, max: 
20630 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
20640 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
20650 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 29 3b 0a  E_MAX_SRCLIST);.
20660 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
20670 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
20680 6c 6c 6f 63 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  lloc>SQLITE_MAX_
20690 53 52 43 4c 49 53 54 20 29 20 6e 41 6c 6c 6f 63  SRCLIST ) nAlloc
206a0 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52   = SQLITE_MAX_SR
206b0 43 4c 49 53 54 3b 0a 20 20 20 20 70 4e 65 77 20  CLIST;.    pNew 
206c0 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
206d0 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20  oc(db, pSrc,.   
206e0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
206f0 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c  of(*pSrc) + (nAl
20700 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53  loc-1)*sizeof(pS
20710 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  rc->a[0]) );.   
20720 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
20730 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
20740 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
20750 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
20760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
20770 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 53 72   = pNew;.    pSr
20780 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c  c->nAlloc = nAll
20790 6f 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f  oc;.  }..  /* Mo
207a0 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74  ve existing slot
207b0 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65  s that come afte
207c0 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65  r the newly inse
207d0 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20  rted slots.  ** 
207e0 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a  out of the way *
207f0 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e  /.  for(i=pSrc->
20800 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72  nSrc-1; i>=iStar
20810 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72  t; i--){.    pSr
20820 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d  c->a[i+nExtra] =
20830 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d   pSrc->a[i];.  }
20840 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d  .  pSrc->nSrc +=
20850 20 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a   nExtra;..  /* Z
20860 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c  ero the newly al
20870 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f  located slots */
20880 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d  .  memset(&pSrc-
20890 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73  >a[iStart], 0, s
208a0 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
208b0 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72  )*nExtra);.  for
208c0 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74  (i=iStart; i<iSt
208d0 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29  art+nExtra; i++)
208e0 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d  {.    pSrc->a[i]
208f0 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
20900 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20   }..  /* Return 
20910 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
20920 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73   enlarged SrcLis
20930 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53  t */.  return pS
20940 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70  rc;.}.../*.** Ap
20950 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65  pend a new table
20960 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76   name to the giv
20970 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65  en SrcList.  Cre
20980 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73  ate a new SrcLis
20990 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
209a0 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
209b0 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
209c0 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20  SrcList even if 
209d0 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a  pTable is NULL..
209e0 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20  **.** A SrcList 
209f0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
20a00 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73  NULL if there is
20a10 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 72   an OOM error or
20a20 20 69 66 20 74 68 65 0a 2a 2a 20 53 72 63 4c 69   if the.** SrcLi
20a30 73 74 20 67 72 6f 77 73 20 74 6f 20 6c 61 72 67  st grows to larg
20a40 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  e.  The returned
20a50 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68  .** SrcList migh
20a60 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
20a70 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
20a80 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69  t was input or i
20a90 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20  t might be.** a 
20aa0 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20  new one.  If an 
20ab0 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f  OOM error does o
20ac0 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
20ad0 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70  prior value of p
20ae0 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20  List.** that is 
20af0 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
20b00 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74  utine is automat
20b10 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a  ically freed..**
20b20 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65  .** If pDatabase
20b30 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74   is not null, it
20b40 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
20b50 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74  table has an opt
20b60 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ional.** databas
20b70 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20  e name prefix.  
20b80 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74  Like this:  "dat
20b90 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54  abase.table".  T
20ba0 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  he pDatabase.** 
20bb0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61  points to the ta
20bc0 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
20bd0 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74   pTable points t
20be0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  o the database n
20bf0 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c  ame..** The SrcL
20c00 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69  ist.a[].zName fi
20c10 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69  eld is filled wi
20c20 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  th the table nam
20c30 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a  e which might.**
20c40 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   come from pTabl
20c50 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20  e (if pDatabase 
20c60 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d  is NULL) or from
20c70 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a   pDatabase.  .**
20c80 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61   SrcList.a[].zDa
20c90 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64  tabase is filled
20ca0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
20cb0 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61  se name from pTa
20cc0 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20  ble,.** or with 
20cd0 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62  NULL if no datab
20ce0 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ase is specified
20cf0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
20d00 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20   words, if call 
20d10 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
20d20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20d30 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
20d40 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,0);.**.** Th
20d50 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20  en B is a table 
20d60 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
20d70 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e  abase name is un
20d80 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63  specified.  If c
20d90 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68  alled.** like th
20da0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
20db0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
20dc0 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b  Append(D,A,B,C);
20dd0 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73  .**.** Then C is
20de0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
20df0 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74  and B is the dat
20e00 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20  abase name.  If 
20e10 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20  C is defined.** 
20e20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49  then so is B.  I
20e30 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
20e40 65 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63  e never have a c
20e50 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a  ase where:.**.**
20e60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20e70 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
20e80 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f  A,0,C);.**.** Bo
20e90 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  th pTable and pD
20ea0 61 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75  atabase are assu
20eb0 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64  med to be quoted
20ec0 2e 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75  .  They are dequ
20ed0 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62  oted.** before b
20ee0 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68  eing added to th
20ef0 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72  e SrcList..*/.Sr
20f00 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
20f10 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50  cListAppend(.  P
20f20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
20f30 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
20f40 6e 74 65 78 74 2c 20 69 6e 20 77 68 69 63 68 20  ntext, in which 
20f50 65 72 72 6f 72 73 20 61 72 65 20 72 65 70 6f 72  errors are repor
20f60 74 65 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ted */.  SrcList
20f70 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
20f80 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53  Append to this S
20f90 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65  rcList. NULL cre
20fa0 61 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69  ates a new SrcLi
20fb0 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  st */.  Token *p
20fc0 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
20fd0 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a  able to append *
20fe0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61  /.  Token *pData
20ff0 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62  base    /* Datab
21000 61 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ase of the table
21010 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
21020 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
21030 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
21040 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  db;.  assert( pD
21050 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54  atabase==0 || pT
21060 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43  able!=0 );  /* C
21070 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74  annot have C wit
21080 68 6f 75 74 20 42 20 2a 2f 0a 20 20 61 73 73 65  hout B */.  asse
21090 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
210a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
210b0 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 64 62  e->db!=0 );.  db
210c0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
210d0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
210e0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
210f0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
21100 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  N(pParse->db, si
21110 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b  zeof(SrcList) );
21120 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
21130 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
21140 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
21150 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  = 1;.    pList->
21160 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 6d 65  nSrc = 1;.    me
21170 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 30  mset(&pList->a[0
21180 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69  ], 0, sizeof(pLi
21190 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  st->a[0]));.    
211a0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  pList->a[0].iCur
211b0 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  sor = -1;.  }els
211c0 65 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  e{.    SrcList *
211d0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 72  pNew = sqlite3Sr
211e0 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 70 50 61  cListEnlarge(pPa
211f0 72 73 65 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70  rse, pList, 1, p
21200 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 20  List->nSrc);.   
21210 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
21220 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
21230 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
21240 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
21250 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
21260 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  {.      pList = 
21270 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pNew;.    }.  }.
21280 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
21290 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d  ->a[pList->nSrc-
212a0 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  1];.  if( pDatab
212b0 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
212c0 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
212d0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
212e0 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
212f0 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   ){.    pItem->z
21300 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
21310 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
21320 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  pDatabase);.    
21330 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
21340 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
21350 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62  omToken(db, pTab
21360 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  le);.  }else{.  
21370 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
21380 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
21390 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
213a0 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44  );.    pItem->zD
213b0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
213c0 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
213d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
213e0 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65   VdbeCursor inde
213f0 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c  x numbers to all
21400 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63   tables in a Src
21410 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  List.*/.void sql
21420 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
21430 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a  nCursors(Parse *
21440 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
21450 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
21460 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
21470 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
21480 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c    assert(pList |
21490 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
214a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
214b0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
214c0 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
214d0 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
214e0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
214f0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  tem++){.      if
21500 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ( pItem->iCursor
21510 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  >=0 ) break;.   
21520 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f     pItem->iCurso
21530 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
21540 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ++;.      if( pI
21550 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
21560 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
21570 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
21580 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65  ors(pParse, pIte
21590 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
215a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
215b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
215c0 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53  lete an entire S
215d0 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67  rcList including
215e0 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75   all its substru
215f0 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cture..*/.void s
21600 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
21610 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
21620 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
21630 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
21640 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
21650 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
21660 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
21670 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
21680 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
21690 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
216a0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
216b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
216c0 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
216d0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
216e0 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
216f0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
21700 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
21710 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
21720 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
21730 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 73  .isIndexedBy ) s
21740 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
21750 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pItem->u1.zInde
21760 78 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20  xedBy);.    if( 
21770 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
21780 75 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78 70  unc ) sqlite3Exp
21790 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
217a0 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
217b0 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
217c0 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
217d0 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
217e0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
217f0 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
21800 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
21810 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
21820 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29  (db, pItem->pOn)
21830 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
21840 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
21850 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
21860 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
21870 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  eNN(db, pList);.
21880 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
21890 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
218a0 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  by the parser to
218b0 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20   add a new term 
218c0 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
218d0 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20   a growing FROM 
218e0 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22  clause.  The "p"
218f0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
21900 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  e part of.** the
21910 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61   FROM clause tha
21920 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
21930 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20  en constructed. 
21940 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20   "p" is NULL.** 
21950 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
21960 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  irst term of the
21970 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70   FROM clause.  p
21980 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62  Table and pDatab
21990 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e  ase.** are the n
219a0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
219b0 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61   and database na
219c0 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
219d0 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20  clause term..** 
219e0 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
219f0 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  L if the databas
21a00 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72  e name qualifier
21a10 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68   is missing - th
21a20 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e  e.** usual case.
21a30 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61    If the term ha
21a40 73 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e  s an alias, then
21a50 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74   pAlias points t
21a60 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74  o the.** alias t
21a70 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65  oken.  If the te
21a80 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  rm is a subquery
21a90 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79  , then pSubquery
21aa0 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   is the.** SELEC
21ab0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
21ac0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e   the subquery en
21ad0 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62  codes.  The pTab
21ae0 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62  le and.** pDatab
21af0 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61  ase parameters a
21b00 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71  re NULL for subq
21b10 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e  ueries.  The pOn
21b20 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70   and pUsing.** p
21b30 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68  arameters are th
21b40 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
21b50 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
21b60 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  auses..**.** Ret
21b70 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73  urn a new SrcLis
21b80 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20  t which encodes 
21b90 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68  is the FROM with
21ba0 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d   the new.** term
21bb0 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69   added..*/.SrcLi
21bc0 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
21bd0 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
21be0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
21bf0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
21c00 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
21c10 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  /.  SrcList *p, 
21c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21c30 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20  he left part of 
21c40 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
21c50 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a  already seen */.
21c60 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
21c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
21c80 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
21c90 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f  o add to the FRO
21ca0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f  M clause */.  To
21cb0 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20  ken *pDatabase, 
21cc0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
21cd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
21ce0 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20  ntaining pTable 
21cf0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69  */.  Token *pAli
21d00 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  as,          /* 
21d10 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
21d20 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75  ide of the AS su
21d30 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
21d40 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65   Select *pSubque
21d50 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75  ry,      /* A su
21d60 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70  bquery used in p
21d70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20  lace of a table 
21d80 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
21d90 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pOn,            
21da0 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75    /* The ON clau
21db0 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a  se of a join */.
21dc0 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67    IdList *pUsing
21dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21de0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
21df0 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20   a join */.){.  
21e00 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
21e10 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
21e20 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
21e30 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70  se->db;.  if( !p
21e40 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69   && (pOn || pUsi
21e50 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ng) ){.    sqlit
21e60 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
21e70 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73  e, "a JOIN claus
21e80 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
21e90 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20  fore %s", .     
21ea0 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22   (pOn ? "ON" : "
21eb0 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20  USING").    );. 
21ec0 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
21ed0 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
21ee0 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c   p = sqlite3SrcL
21ef0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
21f00 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61  , p, pTable, pDa
21f10 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
21f20 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ==0 ){.    goto 
21f30 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
21f40 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  r;.  }.  assert(
21f50 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20   p->nSrc>0 );.  
21f60 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d  pItem = &p->a[p-
21f70 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65  >nSrc-1];.  asse
21f80 72 74 28 20 28 70 54 61 62 6c 65 3d 3d 30 29 3d  rt( (pTable==0)=
21f90 3d 28 70 44 61 74 61 62 61 73 65 3d 3d 30 29 20  =(pDatabase==0) 
21fa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
21fb0 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20  em->zName==0 || 
21fc0 70 44 61 74 61 62 61 73 65 21 3d 30 20 29 3b 0a  pDatabase!=0 );.
21fd0 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
21fe0 4f 42 4a 45 43 54 20 26 26 20 70 49 74 65 6d 2d  OBJECT && pItem-
21ff0 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 54 6f  >zName ){.    To
22000 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 28 41  ken *pToken = (A
22010 4c 57 41 59 53 28 70 44 61 74 61 62 61 73 65 29  LWAYS(pDatabase)
22020 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a   && pDatabase->z
22030 29 20 3f 20 70 44 61 74 61 62 61 73 65 20 3a 20  ) ? pDatabase : 
22040 70 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69  pTable;.    sqli
22050 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61  te3RenameTokenMa
22060 70 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  p(pParse, pItem-
22070 3e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b  >zName, pToken);
22080 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
22090 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66  Alias!=0 );.  if
220a0 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20  ( pAlias->n ){. 
220b0 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
220c0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
220d0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69  omToken(db, pAli
220e0 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  as);.  }.  pItem
220f0 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62  ->pSelect = pSub
22100 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e  query;.  pItem->
22110 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74  pOn = pOn;.  pIt
22120 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73  em->pUsing = pUs
22130 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ing;.  return p;
22140 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  .. append_from_e
22150 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20  rror:.  assert( 
22160 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  p==0 );.  sqlite
22170 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
22180 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  pOn);.  sqlite3I
22190 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
221a0 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74  pUsing);.  sqlit
221b0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
221c0 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20  b, pSubquery);. 
221d0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
221e0 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58  .** Add an INDEX
221f0 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44  ED BY or NOT IND
22200 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74  EXED clause to t
22210 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
22220 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65   added .** eleme
22230 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65  nt of the source
22240 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20  -list passed as 
22250 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
22260 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
22270 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78  ite3SrcListIndex
22280 65 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72  edBy(Parse *pPar
22290 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  se, SrcList *p, 
222a0 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42  Token *pIndexedB
222b0 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  y){.  assert( pI
222c0 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20  ndexedBy!=0 );. 
222d0 20 69 66 28 20 70 20 26 26 20 70 49 6e 64 65 78   if( p && pIndex
222e0 65 64 42 79 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  edBy->n>0 ){.   
222f0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
22300 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
22310 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 72 63   assert( p->nSrc
22320 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20  >0 );.    pItem 
22330 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
22340 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
22350 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64  pItem->fg.notInd
22360 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  exed==0 );.    a
22370 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
22380 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20  .isIndexedBy==0 
22390 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
223a0 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
223b0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  nc==0 );.    if(
223c0 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d   pIndexedBy->n==
223d0 31 20 26 26 20 21 70 49 6e 64 65 78 65 64 42 79  1 && !pIndexedBy
223e0 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ->z ){.      /* 
223f0 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20  A "NOT INDEXED" 
22400 63 6c 61 75 73 65 20 77 61 73 20 73 75 70 70 6c  clause was suppl
22410 69 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79  ied. See parse.y
22420 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74   .      ** const
22430 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70  ruct "indexed_op
22440 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  t" for details. 
22450 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  */.      pItem->
22460 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20  fg.notIndexed = 
22470 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
22480 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49      pItem->u1.zI
22490 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
224a0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
224b0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64  pParse->db, pInd
224c0 65 78 65 64 42 79 29 3b 0a 20 20 20 20 20 20 70  exedBy);.      p
224d0 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
224e0 65 64 42 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  edBy = 1;.    }.
224f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
22500 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75 6e   the list of fun
22510 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
22520 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  to the SrcList e
22530 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61  ntry for a.** ta
22540 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74  ble-valued-funct
22550 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
22560 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41  ite3SrcListFuncA
22570 72 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  rgs(Parse *pPars
22580 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 45  e, SrcList *p, E
22590 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
225a0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
225b0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
225c0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
225d0 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
225e0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
225f0 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d  ->fg.notIndexed=
22600 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
22610 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  ( pItem->fg.isIn
22620 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20  dexedBy==0 );.  
22630 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
22640 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30  >fg.isTabFunc==0
22650 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75   );.    pItem->u
22660 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c 69  1.pFuncArg = pLi
22670 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66  st;.    pItem->f
22680 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31 3b  g.isTabFunc = 1;
22690 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
226a0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
226b0 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
226c0 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pList);.  }.}../
226d0 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69  *.** When buildi
226e0 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61  ng up a FROM cla
226f0 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65  use in the parse
22700 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  r, the join oper
22710 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69  ator.** is initi
22720 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f  ally attached to
22730 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
22740 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65  d.  But the code
22750 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78   generator.** ex
22760 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f  pects the join o
22770 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e  perator to be on
22780 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
22790 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
227a0 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20  e.** Shifts all 
227b0 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66  join operators f
227c0 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
227d0 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20  t for an entire 
227e0 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a  FROM.** clause..
227f0 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53  **.** Example: S
22800 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20  uppose the join 
22810 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  is like this:.**
22820 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20  .**           A 
22830 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f  natural cross jo
22840 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  in B.**.** The o
22850 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75  perator is "natu
22860 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e  ral cross join".
22870 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70    The A and B op
22880 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65  erands are store
22890 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20  d.** in p->a[0] 
228a0 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73  and p->a[1], res
228b0 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20  pectively.  The 
228c0 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79  parser initially
228d0 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f   stores the.** o
228e0 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20  perator with A. 
228f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
22900 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74  ifts that operat
22910 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f  or over to B..*/
22920 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
22930 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70  ListShiftJoinTyp
22940 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20  e(SrcList *p){. 
22950 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
22960 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
22970 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69  ->nSrc-1; i>0; i
22980 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  --){.      p->a[
22990 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d  i].fg.jointype =
229a0 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f   p->a[i-1].fg.jo
229b0 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20  intype;.    }.  
229c0 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69    p->a[0].fg.joi
229d0 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ntype = 0;.  }.}
229e0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
229f0 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61   VDBE code for a
22a00 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74   BEGIN statement
22a10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22a20 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
22a30 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
22a40 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71   int type){.  sq
22a50 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
22a60 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  e *v;.  int i;..
22a70 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
22a80 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  !=0 );.  db = pP
22a90 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
22aa0 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
22ab0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
22ac0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
22ad0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
22ae0 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29  "BEGIN", 0, 0) )
22af0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
22b00 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
22b10 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
22b20 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72    if( !v ) retur
22b30 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54  n;.  if( type!=T
22b40 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20  K_DEFERRED ){.  
22b50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
22b60 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
22b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22b80 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  Op2(v, OP_Transa
22b90 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d  ction, i, (type=
22ba0 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31  =TK_EXCLUSIVE)+1
22bb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22bc0 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
22bd0 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   i);.    }.  }. 
22be0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22bf0 70 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  p0(v, OP_AutoCom
22c00 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  mit);.}../*.** G
22c10 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
22c20 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 20 6f  e for a COMMIT o
22c30 72 20 52 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65  r ROLLBACK state
22c40 6d 65 6e 74 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f  ment..** Code fo
22c50 72 20 52 4f 4c 4c 42 41 43 4b 20 69 73 20 67 65  r ROLLBACK is ge
22c60 6e 65 72 61 74 65 64 20 69 66 20 65 54 79 70 65  nerated if eType
22c70 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20  ==TK_ROLLBACK.  
22c80 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 63 6f 64  Otherwise.** cod
22c90 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  e is generated f
22ca0 6f 72 20 61 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a  or a COMMIT..*/.
22cb0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
22cc0 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
22cd0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 54   *pParse, int eT
22ce0 79 70 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  ype){.  Vdbe *v;
22cf0 0a 20 20 69 6e 74 20 69 73 52 6f 6c 6c 62 61 63  .  int isRollbac
22d00 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  k;..  assert( pP
22d10 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
22d20 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21  ert( pParse->db!
22d30 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
22d40 65 54 79 70 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54  eType==TK_COMMIT
22d50 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 45 4e   || eType==TK_EN
22d60 44 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52  D || eType==TK_R
22d70 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 69 73 52  OLLBACK );.  isR
22d80 6f 6c 6c 62 61 63 6b 20 3d 20 65 54 79 70 65 3d  ollback = eType=
22d90 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  =TK_ROLLBACK;.  
22da0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
22db0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
22dc0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
22dd0 20 0a 20 20 20 20 20 20 20 69 73 52 6f 6c 6c 62   .       isRollb
22de0 61 63 6b 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 22  ack ? "ROLLBACK"
22df0 20 3a 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20   : "COMMIT", 0, 
22e00 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
22e10 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
22e20 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
22e30 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
22e40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22e50 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
22e60 6f 6d 6d 69 74 2c 20 31 2c 20 69 73 52 6f 6c 6c  ommit, 1, isRoll
22e70 62 61 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  back);.  }.}../*
22e80 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
22e90 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
22ea0 68 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69  he parser when i
22eb0 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61  t parses a comma
22ec0 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a  nd to create,.**
22ed0 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
22ee0 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65  back an SQL save
22ef0 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20  point. .*/.void 
22f00 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74  sqlite3Savepoint
22f10 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22f20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70  int op, Token *p
22f30 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
22f40 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
22f50 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
22f60 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  se->db, pName);.
22f70 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
22f80 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
22f90 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
22fa0 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  se);.#ifndef SQL
22fb0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
22fc0 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69  ZATION.    stati
22fd0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63  c const char * c
22fe0 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42  onst az[] = { "B
22ff0 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22  EGIN", "RELEASE"
23000 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a  , "ROLLBACK" };.
23010 20 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56      assert( !SAV
23020 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20  EPOINT_BEGIN && 
23030 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
23040 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e  E==1 && SAVEPOIN
23050 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b  T_ROLLBACK==2 );
23060 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
23070 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74  !v || sqlite3Aut
23080 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
23090 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c  QLITE_SAVEPOINT,
230a0 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20   az[op], zName, 
230b0 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
230c0 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
230d0 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
230e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
230f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
23100 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61  eAddOp4(v, OP_Sa
23110 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20  vepoint, op, 0, 
23120 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e  0, zName, P4_DYN
23130 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
23140 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
23150 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
23160 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69  is open and avai
23170 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20  lable for use.  
23180 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
23190 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
231a0 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
231b0 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65   messages in the
231c0 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
231d0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
231e0 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
231f0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
23200 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
23210 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
23220 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
23230 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  Bt==0 && !pParse
23240 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
23250 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72   int rc;.    Btr
23260 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61  ee *pBt;.    sta
23270 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c  tic const int fl
23280 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ags = .         
23290 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
232a0 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20  DWRITE |.       
232b0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
232c0 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
232d0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
232e0 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20  CLUSIVE |.      
232f0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
23300 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
23310 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
23320 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a  _OPEN_TEMP_DB;..
23330 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23340 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56  BtreeOpen(db->pV
23350 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c  fs, 0, db, &pBt,
23360 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20   0, flags);.    
23370 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23380 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
23390 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
233a0 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  e, "unable to op
233b0 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
233c0 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
233d0 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
233e0 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
233f0 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50  bles");.      pP
23400 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
23410 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
23420 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62     }.    db->aDb
23430 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20  [1].pBt = pBt;. 
23440 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
23450 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b  Db[1].pSchema );
23460 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
23470 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74  NOMEM==sqlite3Bt
23480 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  reeSetPageSize(p
23490 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65  Bt, db->nextPage
234a0 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a  size, -1, 0) ){.
234b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
234c0 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20  Fault(db);.     
234d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
234e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
234f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
23500 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
23510 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
23520 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
23530 20 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72   verified.** for
23540 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 20   database iDb.  
23550 54 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74 75  The code to actu
23560 61 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65 20  ally verify the 
23570 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a  schema cookie.**
23580 20 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20 74   will occur at t
23590 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 6f  he end of the to
235a0 70 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e 64  p-level VDBE and
235b0 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
235c0 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20  ed.** later, by 
235d0 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64  sqlite3FinishCod
235e0 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ing()..*/.void s
235f0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
23600 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
23610 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
23620 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
23630 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
23640 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
23650 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44  );..  assert( iD
23660 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72  b>=0 && iDb<pPar
23670 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  se->db->nDb );. 
23680 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
23690 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42  >db->aDb[iDb].pB
236a0 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
236b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c  ;.  assert( iDb<
236c0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
236d0 48 45 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72  HED+2 );.  asser
236e0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
236f0 4d 75 74 65 78 48 65 6c 64 28 70 50 61 72 73 65  MutexHeld(pParse
23700 2d 3e 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  ->db, iDb, 0) );
23710 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73  .  if( DbMaskTes
23720 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f  t(pToplevel->coo
23730 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30  kieMask, iDb)==0
23740 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65   ){.    DbMaskSe
23750 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f  t(pToplevel->coo
23760 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20  kieMask, iDb);. 
23770 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
23780 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
23790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
237a0 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
237b0 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d  Toplevel);.    }
237c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
237d0 20 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73   argument zDb is
237e0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c   NULL, then call
237f0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
23800 66 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65  fySchema() for e
23810 61 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64  ach .** attached
23820 20 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72   database. Other
23830 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20  wise, invoke it 
23840 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
23850 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e   named zDb only.
23860 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23870 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
23880 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61  chema(Parse *pPa
23890 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
238a0 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33  *zDb){.  sqlite3
238b0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
238c0 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  b;.  int i;.  fo
238d0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
238e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a  ; i++){.    Db *
238f0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
23900 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
23910 70 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20  pBt && (!zDb || 
23920 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
23930 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 44 62 53  p(zDb, pDb->zDbS
23940 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20  Name)) ){.      
23950 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
23960 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
23970 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  i);.    }.  }.}.
23980 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
23990 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
239a0 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
239b0 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
239c0 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
239d0 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
239e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
239f0 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
23a00 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
23a10 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
23a20 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
23a30 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
23a40 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
23a50 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
23a60 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
23a70 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
23a80 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74  t if the setStat
23a90 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ement parameter 
23aa0 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
23ab0 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
23ac0 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
23ad0 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
23ae0 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
23af0 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
23b00 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
23b10 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
23b20 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
23b30 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
23b40 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
23b50 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
23b60 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
23b70 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
23b80 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
23b90 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
23ba0 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
23bb0 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
23bc0 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
23bd0 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
23be0 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
23bf0 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
23c00 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
23c10 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
23c20 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   be set..*/.void
23c30 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
23c40 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
23c50 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
23c60 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74  etStatement, int
23c70 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a   iDb){.  Parse *
23c80 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
23c90 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
23ca0 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
23cb0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
23cc0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
23cd0 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54  ;.  DbMaskSet(pT
23ce0 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61  oplevel->writeMa
23cf0 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70  sk, iDb);.  pTop
23d00 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72  level->isMultiWr
23d10 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d  ite |= setStatem
23d20 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ent;.}../*.** In
23d30 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
23d40 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e  statement curren
23d50 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
23d60 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69  uction might wri
23d70 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  te.** more than 
23d80 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70  one entry (examp
23d90 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65  le: deleting one
23da0 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74   row then insert
23db0 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20  ing another,.** 
23dc0 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70  inserting multip
23dd0 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62  le rows in a tab
23de0 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67  le, or inserting
23df0 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78   a row and index
23e00 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66   entries.).** If
23e10 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73   an abort occurs
23e20 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74   after some of t
23e30 68 65 73 65 20 77 72 69 74 65 73 20 68 61 76 65  hese writes have
23e40 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e   completed, then
23e50 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e   it will.** be n
23e60 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f  ecessary to undo
23e70 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77   the completed w
23e80 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rites..*/.void s
23e90 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65  qlite3MultiWrite
23ea0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
23eb0 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
23ec0 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
23ed0 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
23ee0 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  e);.  pToplevel-
23ef0 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20  >isMultiWrite = 
23f00 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65  1;.}../* .** The
23f10 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
23f20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
23f30 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f 76 65  ne if is discove
23f40 72 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a  rs that it is.**
23f50 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f   possible to abo
23f60 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70  rt a statement p
23f70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69  rior to completi
23f80 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  on.  In order to
23f90 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69   .** perform thi
23fa0 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20  s abort without 
23fb0 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20 64  corrupting the d
23fc0 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64  atabase, we need
23fd0 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65   to make.** sure
23fe0 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
23ff0 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65 64  ent is protected
24000 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20   by a statement 
24010 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
24020 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20  ** Technically, 
24030 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  we only need to 
24040 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74  set the mayAbort
24050 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20   flag if the.** 
24060 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61  isMultiWrite fla
24070 67 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  g was previously
24080 20 73 65 74 2e 20 20 54 68 65 72 65 20 69 73 20   set.  There is 
24090 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63  a time dependenc
240a0 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74  y.** such that t
240b0 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63  he abort must oc
240c0 63 75 72 20 61 66 74 65 72 20 74 68 65 20 6d 75  cur after the mu
240d0 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69 73 20  ltiwrite.  This 
240e0 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74  makes.** some st
240f0 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69  atements involvi
24100 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45 20 63  ng the REPLACE c
24110 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
24120 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20  on algorithm.** 
24130 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74  go a little fast
24140 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20  er.  But taking 
24150 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69  advantage of thi
24160 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63  s time dependenc
24170 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f  y.** makes it mo
24180 72 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20  re difficult to 
24190 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 63  prove that the c
241a0 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74 20 28  ode is correct (
241b0 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61  in .** particula
241c0 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20 75  r, it prevents u
241d0 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61  s from writing a
241e0 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69  n effective.** i
241f0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
24200 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
24210 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f  yAbort()) and so
24220 20 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a   we have chosen.
24230 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73  ** to take the s
24240 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b  afe route and sk
24250 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  ip the optimizat
24260 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
24270 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72  ite3MayAbort(Par
24280 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
24290 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
242a0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
242b0 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
242c0 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79    pToplevel->may
242d0 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Abort = 1;.}../*
242e0 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
242f0 61 6c 74 20 74 68 61 74 20 63 61 75 73 65 73 20  alt that causes 
24300 74 68 65 20 76 64 62 65 20 74 6f 20 72 65 74 75  the vdbe to retu
24310 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  rn an SQLITE_CON
24320 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72  STRAINT.** error
24330 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61  . The onError pa
24340 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
24350 65 73 20 77 68 69 63 68 20 28 69 66 20 61 6e 79  es which (if any
24360 29 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  ) of the stateme
24370 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72  nt.** and/or cur
24380 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
24390 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
243a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
243b0 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a  HaltConstraint(.
243c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
243d0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
243e0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
243f0 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a  errCode,      /*
24400 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20   extended error 
24410 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  code */.  int on
24420 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
24430 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a  onstraint type *
24440 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20  /.  char *p4,   
24450 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d        /* Error m
24460 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70  essage */.  i8 p
24470 34 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a  4type,        /*
24480 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34   P4_STATIC or P4
24490 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20  _TRANSIENT */.  
244a0 75 38 20 70 35 45 72 72 6d 73 67 20 20 20 20 20  u8 p5Errmsg     
244b0 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74    /* P5_ErrMsg t
244c0 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ype */.){.  Vdbe
244d0 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
244e0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
244f0 61 73 73 65 72 74 28 20 28 65 72 72 43 6f 64 65  assert( (errCode
24500 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
24510 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69  ONSTRAINT );.  i
24520 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  f( onError==OE_A
24530 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  bort ){.    sqli
24540 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
24550 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  se);.  }.  sqlit
24560 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
24570 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65  OP_Halt, errCode
24580 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34  , onError, 0, p4
24590 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 73 71 6c  , p4type);.  sql
245a0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
245b0 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d  (v, p5Errmsg);.}
245c0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
245d0 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 55  OP_Halt due to U
245e0 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59  NIQUE or PRIMARY
245f0 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
24600 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  violation..*/.vo
24610 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65  id sqlite3Unique
24620 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
24630 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
24640 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
24650 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  xt */.  int onEr
24660 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ror,      /* Con
24670 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a  straint type */.
24680 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
24690 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
246a0 20 74 68 61 74 20 74 72 69 67 67 65 72 73 20 74   that triggers t
246b0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  he constraint */
246c0 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  .){.  char *zErr
246d0 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72  ;.  int j;.  Str
246e0 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20  Accum errMsg;.  
246f0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
24700 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73  dx->pTable;..  s
24710 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
24720 69 74 28 26 65 72 72 4d 73 67 2c 20 70 50 61 72  it(&errMsg, pPar
24730 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 32 30  se->db, 0, 0, 20
24740 30 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e  0);.  if( pIdx->
24750 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20 20 20  aColExpr ){.    
24760 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
24770 6e 64 66 28 26 65 72 72 4d 73 67 2c 20 22 69 6e  ndf(&errMsg, "in
24780 64 65 78 20 27 25 71 27 22 2c 20 70 49 64 78 2d  dex '%q'", pIdx-
24790 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  >zName);.  }else
247a0 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
247b0 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
247c0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  j++){.      char
247d0 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73   *zCol;.      as
247e0 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f  sert( pIdx->aiCo
247f0 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[j]>=0 );.  
24800 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
24810 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
24820 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
24830 20 20 20 20 20 20 69 66 28 20 6a 20 29 20 73 71        if( j ) sq
24840 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
24850 28 26 65 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20  (&errMsg, ", ", 
24860 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
24870 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28  3_str_appendall(
24880 26 65 72 72 4d 73 67 2c 20 70 54 61 62 2d 3e 7a  &errMsg, pTab->z
24890 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
248a0 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28  ite3_str_append(
248b0 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c 20 31 29  &errMsg, ".", 1)
248c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
248d0 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65  str_appendall(&e
248e0 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20  rrMsg, zCol);.  
248f0 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d    }.  }.  zErr =
24900 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
24910 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67 29 3b  Finish(&errMsg);
24920 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  .  sqlite3HaltCo
24930 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
24940 20 0a 20 20 20 20 49 73 50 72 69 6d 61 72 79 4b   .    IsPrimaryK
24950 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 3f 20  eyIndex(pIdx) ? 
24960 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
24970 54 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a 20 20  T_PRIMARYKEY .  
24980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24990 20 20 20 20 20 20 20 20 20 20 3a 20 53 51 4c 49            : SQLI
249a0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e  TE_CONSTRAINT_UN
249b0 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f  IQUE,.    onErro
249c0 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41  r, zErr, P4_DYNA
249d0 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69  MIC, P5_Constrai
249e0 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f  ntUnique);.}.../
249f0 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
24a00 48 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d  Halt due to non-
24a10 75 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f  unique rowid..*/
24a20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 77  .void sqlite3Row
24a30 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  idConstraint(.  
24a40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
24a50 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
24a60 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  text */.  int on
24a70 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
24a80 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
24a90 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  on algorithm */.
24aa0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20 20    Table *pTab   
24ab0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
24ac0 20 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e   with the non-un
24ad0 69 71 75 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29  ique rowid */ .)
24ae0 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
24af0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
24b00 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29  pTab->iPKey>=0 )
24b10 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  {.    zMsg = sql
24b20 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
24b30 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c  se->db, "%s.%s",
24b40 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
24b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b60 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
24b70 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e  ol[pTab->iPKey].
24b80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  zName);.    rc =
24b90 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
24ba0 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20  NT_PRIMARYKEY;. 
24bb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67   }else{.    zMsg
24bc0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
24bd0 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25  f(pParse->db, "%
24be0 73 2e 72 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e  s.rowid", pTab->
24bf0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  zName);.    rc =
24c00 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
24c10 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20  NT_ROWID;.  }.  
24c20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
24c30 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 72 63  raint(pParse, rc
24c40 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c  , onError, zMsg,
24c50 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20   P4_DYNAMIC,.   
24c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c70 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72 61 69       P5_Constrai
24c80 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a  ntUnique);.}../*
24c90 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
24ca0 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20   if pIndex uses 
24cb0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
24cc0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52  quence pColl.  R
24cd0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
24ce0 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c   it does and fal
24cf0 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  se if it does no
24d00 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
24d10 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
24d20 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  X.static int col
24d30 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73  lationMatch(cons
24d40 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49  t char *zColl, I
24d50 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20  ndex *pIndex){. 
24d60 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
24d70 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( zColl!=0 );.  
24d80 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65  for(i=0; i<pInde
24d90 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
24da0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
24db0 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a   *z = pIndex->az
24dc0 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73  Coll[i];.    ass
24dd0 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e  ert( z!=0 || pIn
24de0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
24df0 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  <0 );.    if( pI
24e00 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
24e10 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69 74  ]>=0 && 0==sqlit
24e20 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f  e3StrICmp(z, zCo
24e30 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ll) ){.      ret
24e40 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
24e50 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
24e60 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
24e70 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
24e80 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20  es of pTab that 
24e90 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
24ea0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
24eb0 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ..** If pColl==0
24ec0 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20   then recompute 
24ed0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
24ee0 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  Tab..*/.#ifndef 
24ef0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
24f00 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
24f10 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72  reindexTable(Par
24f20 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
24f30 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f  e *pTab, char co
24f40 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 69  nst *zColl){.  i
24f50 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  f( !IsVirtual(pT
24f60 61 62 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ab) ){.    Index
24f70 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
24f80 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
24f90 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
24fa0 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20  th pTab */..    
24fb0 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d  for(pIndex=pTab-
24fc0 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
24fd0 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e   pIndex=pIndex->
24fe0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
24ff0 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f  ( zColl==0 || co
25000 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f  llationMatch(zCo
25010 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20  ll, pIndex) ){. 
25020 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d         int iDb =
25030 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
25040 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
25050 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
25060 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
25070 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
25080 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
25090 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
250a0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
250b0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
250c0 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   -1);.      }.  
250d0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
250e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
250f0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
25100 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
25110 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65  ll databases whe
25120 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65  re the.** indice
25130 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  s use the collat
25140 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
25150 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ll.  If pColl==0
25160 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a   then recompute.
25170 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65  ** all indices e
25180 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69  verywhere..*/.#i
25190 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
251a0 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
251b0 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74   void reindexDat
251c0 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50  abases(Parse *pP
251d0 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74  arse, char const
251e0 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a   *zColl){.  Db *
251f0 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
25200 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
25210 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  gle database */.
25220 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25240 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
25250 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
25260 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
25270 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
25280 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
25290 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68  ection */.  Hash
252a0 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
252b0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
252c0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
252d0 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54  es in pDb */.  T
252e0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
252f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
25300 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
25310 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65  abase */..  asse
25320 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
25330 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28  HoldsAllMutexes(
25340 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65  db) );  /* Neede
25350 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
25360 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62  ess */.  for(iDb
25370 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b  =0, pDb=db->aDb;
25380 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
25390 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20  b++, pDb++){.   
253a0 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30 20   assert( pDb!=0 
253b0 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c  );.    for(k=sql
253c0 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44  iteHashFirst(&pD
253d0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
253e0 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69  ash);  k; k=sqli
253f0 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a  teHashNext(k)){.
25400 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
25410 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
25420 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65  ata(k);.      re
25430 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
25440 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b  e, pTab, zColl);
25450 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
25460 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
25470 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
25480 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
25490 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52  ..**.**        R
254a0 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20  EINDEX          
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254c0 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20    -- 1.**       
254d0 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61   REINDEX  <colla
254e0 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20  tion>           
254f0 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20      -- 2.**     
25500 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
25510 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e  tabase>.?<tablen
25520 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20  ame>  -- 3.**   
25530 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
25540 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65  database>.?<inde
25550 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a  xname>  -- 4.**.
25560 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73  ** Form 1 causes
25570 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
25580 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
25590 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62  abases to be reb
255a0 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20  uilt..** Form 2 
255b0 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64  rebuilds all ind
255c0 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  ices in all data
255d0 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74  bases that use t
255e0 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c  he named.** coll
255f0 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20  ating function. 
25600 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72   Forms 3 and 4 r
25610 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64  ebuild the named
25620 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a   index or all.**
25630 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
25640 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
25650 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66  ed table..*/.#if
25660 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25670 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71  _REINDEX.void sq
25680 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72  lite3Reindex(Par
25690 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
256a0 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e  n *pName1, Token
256b0 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c   *pName2){.  Col
256c0 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
256d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
256e0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
256f0 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20  o be reindexed, 
25700 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61  or NULL */.  cha
25710 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
25720 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
25730 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
25740 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndex */.  const 
25750 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20  char *zDb;      
25760 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
25770 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
25780 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
25790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
257a0 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
257b0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49   database */.  I
257c0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
257d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
257e0 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
257f0 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20  d with pTab */. 
25800 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
25810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25820 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
25830 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
25840 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
25850 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
25860 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
25870 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ction */.  Token
25880 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20   *pObjName;     
25890 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
258a0 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
258b0 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64  ndex to be reind
258c0 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  exed */..  /* Re
258d0 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
258e0 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72  schema. If an er
258f0 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
25900 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
25910 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65  ge.  ** and code
25920 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
25930 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  eturn NULL. */. 
25940 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
25950 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
25960 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
25970 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
25980 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b  if( pName1==0 ){
25990 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61  .    reindexData
259a0 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29  bases(pParse, 0)
259b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
259c0 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28  }else if( NEVER(
259d0 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e  pName2==0) || pN
259e0 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  ame2->z==0 ){.  
259f0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20    char *zColl;. 
25a00 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
25a10 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c  1->z );.    zCol
25a20 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
25a30 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
25a40 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  >db, pName1);.  
25a50 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72    if( !zColl ) r
25a60 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c  eturn;.    pColl
25a70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
25a80 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
25a90 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20  ), zColl, 0);.  
25aa0 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
25ab0 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61       reindexData
25ac0 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43  bases(pParse, zC
25ad0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oll);.      sqli
25ae0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
25af0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oll);.      retu
25b00 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
25b10 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
25b20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44  zColl);.  }.  iD
25b30 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
25b40 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
25b50 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
25b60 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
25b70 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
25b80 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
25b90 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
25ba0 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
25bb0 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
25bc0 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b    zDb = db->aDb[
25bd0 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
25be0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
25bf0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20  indTable(db, z, 
25c00 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  zDb);.  if( pTab
25c10 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54   ){.    reindexT
25c20 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
25c30 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
25c40 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
25c50 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
25c60 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
25c70 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
25c80 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69   z, zDb);.  sqli
25c90 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
25ca0 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
25cb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
25cc0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
25cd0 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
25ce0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66  ;.    sqlite3Ref
25cf0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
25d00 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
25d10 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
25d20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
25d30 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
25d40 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
25d50 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69  object to be rei
25d60 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64  ndexed");.}.#end
25d70 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
25d80 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
25d90 74 75 72 65 20 74 68 61 74 20 69 73 20 61 70 70  ture that is app
25da0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
25db0 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a   given Index..**
25dc0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73  .** The caller s
25dd0 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c  hould invoke sql
25de0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
25df0 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e  () on the return
25e00 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65  ed object.** whe
25e10 6e 20 69 74 20 68 61 73 20 66 69 6e 69 73 68 65  n it has finishe
25e20 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b  d using it..*/.K
25e30 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
25e40 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61  eyInfoOfIndex(Pa
25e50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
25e60 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74  ex *pIdx){.  int
25e70 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   i;.  int nCol =
25e80 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
25e90 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64    int nKey = pId
25ea0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65  x->nKeyCol;.  Ke
25eb0 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69  yInfo *pKey;.  i
25ec0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
25ed0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
25ee0 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e  ( pIdx->uniqNotN
25ef0 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79 20  ull ){.    pKey 
25f00 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
25f10 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
25f20 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65  , nKey, nCol-nKe
25f30 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  y);.  }else{.   
25f40 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b   pKey = sqlite3K
25f50 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72  eyInfoAlloc(pPar
25f60 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29  se->db, nCol, 0)
25f70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79  ;.  }.  if( pKey
25f80 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
25f90 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
25fa0 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20  Writeable(pKey) 
25fb0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
25fc0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
25fd0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
25fe0 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
25ff0 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70  Coll[i];.      p
26000 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Key->aColl[i] = 
26010 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33 53 74  zColl==sqlite3St
26020 72 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a 20 20  rBINARY ? 0 :.  
26030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26040 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
26050 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
26060 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
26070 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65   pKey->aSortOrde
26080 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f  r[i] = pIdx->aSo
26090 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20  rtOrder[i];.    
260a0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  }.    if( pParse
260b0 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ->nErr ){.      
260c0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
260d0 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
260e0 5f 4d 49 53 53 49 4e 47 5f 43 4f 4c 4c 53 45 51  _MISSING_COLLSEQ
260f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
26100 64 78 2d 3e 62 4e 6f 51 75 65 72 79 3d 3d 30 20  dx->bNoQuery==0 
26110 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 65  ){.        /* De
26120 61 63 74 69 76 61 74 65 20 74 68 65 20 69 6e 64  activate the ind
26130 65 78 20 62 65 63 61 75 73 65 20 69 74 20 63 6f  ex because it co
26140 6e 74 61 69 6e 73 20 61 6e 20 75 6e 6b 6e 6f 77  ntains an unknow
26150 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 20 20  n collating.    
26160 20 20 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e      ** sequence.
26170 20 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 20 74    The only way t
26180 6f 20 72 65 61 63 74 69 76 65 20 74 68 65 20 69  o reactive the i
26190 6e 64 65 78 20 69 73 20 74 6f 20 72 65 6c 6f 61  ndex is to reloa
261a0 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
261b0 20 73 63 68 65 6d 61 2e 20 20 41 64 64 69 6e 67   schema.  Adding
261c0 20 74 68 65 20 6d 69 73 73 69 6e 67 20 63 6f 6c   the missing col
261d0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
261e0 6c 61 74 65 72 20 64 6f 65 73 20 6e 6f 74 0a 20  later does not. 
261f0 20 20 20 20 20 20 20 2a 2a 20 72 65 61 63 74 69         ** reacti
26200 76 65 20 74 68 65 20 69 6e 64 65 78 2e 20 20 54  ve the index.  T
26210 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 68  he application h
26220 61 64 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f  ad the chance to
26230 20 72 65 67 69 73 74 65 72 0a 20 20 20 20 20 20   register.      
26240 20 20 2a 2a 20 74 68 65 20 6d 69 73 73 69 6e 67    ** the missing
26250 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74 68 65   index using the
26260 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65 64 65   collation-neede
26270 64 20 63 61 6c 6c 62 61 63 6b 2e 20 20 46 6f 72  d callback.  For
26280 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6d 70  .        ** simp
26290 6c 69 63 69 74 79 2c 20 53 51 4c 69 74 65 20 77  licity, SQLite w
262a0 69 6c 6c 20 6e 6f 74 20 67 69 76 65 20 74 68 65  ill not give the
262b0 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 61 20 73   application a s
262c0 65 63 6f 6e 64 20 63 68 61 6e 63 65 2e 0a 20 20  econd chance..  
262d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
262e0 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79 20   pIdx->bNoQuery 
262f0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 1;.        pPa
26300 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
26310 5f 45 52 52 4f 52 5f 52 45 54 52 59 3b 0a 20 20  _ERROR_RETRY;.  
26320 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
26330 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
26340 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 70 4b 65  pKey);.      pKe
26350 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = 0;.    }.  }
26360 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a  .  return pKey;.
26370 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
26380 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a  E_OMIT_CTE./* .*
26390 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
263a0 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70  s invoked once p
263b0 65 72 20 43 54 45 20 62 79 20 74 68 65 20 70 61  er CTE by the pa
263c0 72 73 65 72 20 77 68 69 6c 65 20 70 61 72 73 69  rser while parsi
263d0 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c  ng a .** WITH cl
263e0 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a  ause. .*/.With *
263f0 73 71 6c 69 74 65 33 57 69 74 68 41 64 64 28 0a  sqlite3WithAdd(.
26400 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
26410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
26420 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
26430 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20    With *pWith,  
26440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69            /* Exi
26450 73 74 69 6e 67 20 57 49 54 48 20 63 6c 61 75 73  sting WITH claus
26460 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
26470 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
26480 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
26490 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61  of the common-ta
264a0 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
264b0 74 20 2a 70 41 72 67 6c 69 73 74 2c 20 20 20 20  t *pArglist,    
264c0 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c   /* Optional col
264d0 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f  umn name list fo
264e0 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  r the table */. 
264f0 20 53 65 6c 65 63 74 20 2a 70 51 75 65 72 79 20   Select *pQuery 
26500 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72           /* Quer
26510 79 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61  y used to initia
26520 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20 2a  lize the table *
26530 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
26540 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
26550 0a 20 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20  .  With *pNew;. 
26560 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20   char *zName;.. 
26570 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
26580 68 65 20 43 54 45 20 6e 61 6d 65 20 69 73 20 75  he CTE name is u
26590 6e 69 71 75 65 20 77 69 74 68 69 6e 20 74 68 69  nique within thi
265a0 73 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 49  s WITH clause. I
265b0 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72  f.  ** not, stor
265c0 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68  e an error in th
265d0 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72  e Parse structur
265e0 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20  e. */.  zName = 
265f0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
26600 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
26610 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
26620 4e 61 6d 65 20 26 26 20 70 57 69 74 68 20 29 7b  Name && pWith ){
26630 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
26640 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68  for(i=0; i<pWith
26650 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCte; i++){.  
26660 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
26670 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57  trICmp(zName, pW
26680 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ith->a[i].zName)
26690 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
266a0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
266b0 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
266c0 65 20 57 49 54 48 20 74 61 62 6c 65 20 6e 61 6d  e WITH table nam
266d0 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
266e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
266f0 7d 0a 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  }..  if( pWith )
26700 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
26710 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29  = sizeof(*pWith)
26720 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74 68   + (sizeof(pWith
26730 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d  ->a[1]) * pWith-
26740 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65 77  >nCte);.    pNew
26750 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
26760 6c 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20 6e  loc(db, pWith, n
26770 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
26780 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
26790 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
267a0 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68  b, sizeof(*pWith
267b0 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ));.  }.  assert
267c0 28 20 28 70 4e 65 77 21 3d 30 20 26 26 20 7a 4e  ( (pNew!=0 && zN
267d0 61 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d  ame!=0) || db->m
267e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
267f0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
26800 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
26810 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
26820 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73 74  ete(db, pArglist
26830 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
26840 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
26850 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  Query);.    sqli
26860 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
26870 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d  ame);.    pNew =
26880 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b   pWith;.  }else{
26890 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
268a0 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74  w->nCte].pSelect
268b0 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20 70   = pQuery;.    p
268c0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
268d0 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c  e].pCols = pArgl
268e0 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ist;.    pNew->a
268f0 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61  [pNew->nCte].zNa
26900 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
26910 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
26920 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30 3b  te].zCteErr = 0;
26930 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b  .    pNew->nCte+
26940 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  +;.  }..  return
26950 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
26960 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  Free the content
26970 73 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f 62  s of the With ob
26980 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
26990 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
269a0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
269b0 74 65 33 57 69 74 68 44 65 6c 65 74 65 28 73 71  te3WithDelete(sq
269c0 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20  lite3 *db, With 
269d0 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20 70  *pWith){.  if( p
269e0 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20  With ){.    int 
269f0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
26a00 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69  i<pWith->nCte; i
26a10 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
26a20 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26 70  t Cte *pCte = &p
26a30 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  With->a[i];.    
26a40 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
26a50 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65  tDelete(db, pCte
26a60 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20  ->pCols);.      
26a70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
26a80 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 53  ete(db, pCte->pS
26a90 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71  elect);.      sq
26aa0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
26ab0 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
26ac0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
26ad0 62 46 72 65 65 28 64 62 2c 20 70 57 69 74 68 29  bFree(db, pWith)
26ae0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
26af0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
26b00 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a     E_OMIT_CTE) */.